给出以下代码(在Linux下运行)......
import threading
import time
def donothing(quit):
while True:
if quit.wait(1):
break
print 'quitting'
quit = threading.Event()
try:
t = threading.Thread(target=donothing, args=(quit,))
t.start()
t.join()
except KeyboardInterrupt:
print 'interrupt!'
quit.set()
在程序运行时输入^C
将不生成KeyboardInterrupt
:
python example.py
^C^C^C^C^C^C^C^C^C
将任何值的超时添加到t.join()
会更改此行为。也就是说,如果我改为:
t.join(86400)
然后我看到(无需等待86400秒):
$ python example.py
^Cinterrupt!
quitting
这里发生了什么?我假设在第一种情况下join
操作锁定GIL并阻止任何信号处理程序运行,但为什么添加任何超时会改变这种行为?
我花了一点时间浏览代码,虽然我在Modules/_threadmodule.c
的某个地方迷路了,但看起来,好像跟随相同的代码路径,无论是否或没有指定超时。