gpt4 book ai didi

python - BoundedSemaphore 在 KeyboardInterrupt 上的线程中挂起

转载 作者:行者123 更新时间:2023-12-03 13:01:46 24 4
gpt4 key购买 nike

如果在尝试获取信号量时引发 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

我怎样才能让它让最后几个线程自然死亡然后正常退出? (如果你不尝试打断它,它会这样做)

最佳答案

您可以使用信号模块设置一个标志,告诉主线程停止处理:

import threading
import time
import signal
import sys

sigint = False

def sighandler(num, frame):
global sigint
sigint = True

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

signal.signal(signal.SIGINT, sighandler)
sema = threading.BoundedSemaphore(value=5)
threads = []
for x in xrange(100):
sema.acquire()
if sigint:
sys.exit()
t = threading.Thread(target=worker, args=(x, sema))
t.start()
t.join()
threads.append(t)

关于python - BoundedSemaphore 在 KeyboardInterrupt 上的线程中挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/936933/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com