【发布时间】:2011-04-12 10:02:24
【问题描述】:
我已经看到很多与此相关的问题...但是我的代码 works 在 python 2.6.2 上运行,而 fails 在 python 2.6.5 上运行。我认为整个 atexit“当程序被信号杀死时不会调用通过此模块注册的函数”这件事不应该算在内,因为我正在捕捉信号然后干净地退出,我错了吗?这里发生了什么?这样做的正确方法是什么?
import atexit, sys, signal, time, threading
terminate = False
threads = []
def test_loop():
while True:
if terminate:
print('stopping thread')
break
else:
print('looping')
time.sleep(1)
@atexit.register
def shutdown():
global terminate
print('shutdown detected')
terminate = True
for thread in threads:
thread.join()
def close_handler(signum, frame):
print('caught signal')
sys.exit(0)
def run():
global threads
thread = threading.Thread(target=test_loop)
thread.start()
threads.append(thread)
while True:
time.sleep(2)
print('main')
signal.signal(signal.SIGINT, close_handler)
if __name__ == "__main__":
run()
python 2.6.2:
$ python halp.py
looping
looping
looping
main
looping
main
looping
looping
looping
main
looping
^Ccaught signal
shutdown detected
stopping thread
python 2.6.5:
$ python halp.py
looping
looping
looping
main
looping
looping
main
looping
looping
main
^Ccaught signal
looping
looping
looping
looping
...
looping
looping
Killed <- kill -9 process at this point
2.6.5 上的主线程似乎从不执行 atexit 函数。
【问题讨论】:
-
我在 OS X 10.6 上尝试了 Python 2.6.5 和 Python 2.6.1 上的代码,它们的行为与问题中描述的一样(2.6.5 不执行 atexit 而 2.6.1 执行) .我希望更精通 Python 源代码的人能就更改的内容提出建议。
-
可能对此失去了兴趣或找到了解决方法,但我仍然对两个 Python 版本之间触发此问题的变化感兴趣。我不会再问同样的问题,而是要开始赏金。我希望他不介意。
标签: python multithreading signals atexit