BoundedSemaphore висит в потоках на KeyboardInterrupt

Если вы вызываете KeyboardInterrupt при попытке получить семафор, потоки, которые также пытаются освободить один и тот же объект семафора, зависают бесконечно.

Код:

import threading
import time

def worker(i, sema):
    time.sleep(2)
    print i, "finished"
    sema.release()


sema = threading.BoundedSemaphore(value=5)
threads = []
for x in xrange(100):
    sema.acquire()
    t = threading.Thread(target=worker, args=(x, sema))
    t.start()
    threads.append(t)

Запустите это, а затем ^ C, пока он работает. Он будет висеть и никогда не выйдет.

0 finished
3 finished
1 finished
2 finished
4 finished
^C5 finished
Traceback (most recent call last):
  File "/tmp/proof.py", line 15, in <module>
    sema.acquire()
  File "/System/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/threading.py", line 290, in acquire
    self.__cond.wait()
  File "/System/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/threading.py", line 214, in wait
    waiter.acquire()
KeyboardInterrupt
6 finished
7 finished
8 finished
9 finished

Как я могу сделать так, чтобы последние несколько потоков умерли естественной смертью и затем нормально вышли? (что происходит, если вы не пытаетесь его прервать)

Ответы на вопрос(5)

Ваш ответ на вопрос