我得到了如下简单的程序:
import threading
import time
import signal
WITH_DEADLOCK = 0
lock = threading.Lock()
def interruptHandler(signo, frame):
print str(frame), 'received', signo
lock.acquire()
try:
time.sleep(3)
finally:
if WITH_DEADLOCK:
print str(frame), 'release'
lock.release()
signal.signal(signal.SIGINT, interruptHandler)
for x in xrange(60):
print time.strftime("%H:%M:%S"), 'main thread is working'
time.sleep(1)
因此,如果您启动该程序,甚至在 3 秒内按两次 Ctrl+C,则不会出现死锁。每次按下 Ctrl + C 时,都会显示正确的行。 如果您更改 WITH_DEADLOCK=1 并按下 Ctrl+C 两次(3 秒内),那么程序将挂起。
有没有人可以解释为什么打印操作会产生如此大的差异?
(我的python版本是2.6.5)
最佳答案
老实说,我认为 J.F. Sebastian 的评论是这里最合适的答案 - 您需要让您的信号处理程序可重入,目前它不是,而且它在没有打印语句的情况下仍然可以工作,这主要是令人惊讶。
关于python - 为什么信号处理程序中的打印操作可能会改变死锁情况?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10777610/