gpt4 book ai didi

python 2.6.x theading/signals/atexit 在某些版本上失败?

转载 作者:太空狗 更新时间:2023-10-30 00:37:26 27 4
gpt4 key购买 nike

我见过很多与此相关的问题...但我的代码可以在 python 2.6.2 上运行,无法在 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 函数。

最佳答案

这里的根本区别实际上与信号和 atexit 都无关,而是 sys.exit 行为的变化。

在 2.6.5 左右之前,sys.exit(更准确地说,SystemExit 在顶层被捕获)会导致解释器退出;如果线程仍在运行,它们将被终止,就像 POSIX 线程一样。

在 2.6.5 左右,行为发生了变化:sys.exit 的效果现在与从程序的主函数返回基本相同。当您执行那个时——在两个版本中——解释器在退出之前等待所有线程被加入。

相关的变化是 Py_Finalize 现在会在顶部附近调用 wait_for_thread_shutdown(),而以前不会。

此行为更改似乎不正确,主要是因为它不再像记录的那样运行,即:“退出 Python”。实际效果不再是退出Python,而是简单的退出线程。 (作为旁注,sys.exit 在从另一个线程调用时从未退出 Python,但是与记录的行为的模糊差异并不能证明更大的行为是合理的。)

我可以看到新行为的吸引力:没有两种退出主线程的方法(“退出并等待线程”和“立即退出”),只有一种,因为 sys.exit 本质上与简单相同从顶层函数返回。然而,这是一个重大变化,与记录的行为不同,这远远超过了这一点。

由于此更改,在上述信号处理程序的 sys.exit 之后,解释器等待线程退出,然后在线程退出后运行 atexit 处理程序。由于是处理程序本身告诉线程退出,结果是死锁。

关于python 2.6.x theading/signals/atexit 在某些版本上失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3713360/

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