Python:线程和KeyboardInterrupt

时间:2017-11-02 15:55:10

标签: python multithreading

给出以下代码(在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的某个地方迷路了,但看起来,好像跟随相同的代码路径,无论是否或没有指定超时。

0 个答案:

没有答案