0

当python进程的主线程关闭时(通常还是未捕获的异常),有没有办法执行一个函数?如何最终确定主线程?

我希望atexit.register将提供该功能,但显然它当主线程终止不会被调用 - 只有当已经终止所有线程。因此,作为打算在代码不起作用:

import atexit 
import threading 

done = False 

def stop_child_thread(): 
    global done 
    done = True 

def child_thread(): 
    while not done: 
     pass 

atexit.register(stop_child_thread) 
t = threading.Thread(target=child_thread) 
t.start() 

我不想启动子线程的守护线程,因为我希望它有机会后自己清理终止前。

我现在唯一能想到的解决方案是定期检查(从子线程或专用线程)主线程是否仍然存在,如果没有,请运行我需要的功能。

回答

1

一个想法是将有另一个线程join主线程,然后执行清理:

def cleanup_on_main_thread_exit(): 
    threading.main_thread().join() 
    do_whatever() 

threading.Thread(target=cleanup_on_main_thread_exit).start() 
+0

THX,这个似乎简单的设置,我在我的问题表现出的工作 - 这是比轮询更好我打算使用。不幸的是,在实际的代码中,它导致了一个小小的错误:尽管所有线程都成功完成,python解释器似乎仍然活着;它很容易被CTRL-C停止。我不确定发生了什么事,我不能用一个小例子来重复它;也许python解释器退出机制变得困惑。 – max