Wenn Sie ein KeyboardInterrupt auslösen, während Sie versuchen, ein Semaphor zu erwerben, hängen die Threads, die versuchen, dasselbe Semaphore-Objekt ebenfalls zu veröffentlichen, auf unbestimmte Zeit.BoundedSemaphore hängt in Threads auf KeyboardInterrupt
Code:
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)
diese starten und dann^C, wie es läuft. Es wird hängen bleiben und niemals enden.
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
Wie kann ich es bekommen, dass die letzten paar Threads natürlichen Todes sterben und dann normal aussteigen? (Was es tut, wenn Sie nicht versuchen, es zu unterbrechen)
Sicherlich mehr als 2 Personen Haben Sie dieses Problem, verdienen Sie weit mehr als 2 Stimmen. Ich frage mich, wie bist du auf diese Antwort gekommen? – num1