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
Как я могу сделать так, чтобы последние несколько потоков умерли естественной смертью и затем нормально вышли? (что происходит, если вы не пытаетесь его прервать)