【问题标题】:Finally clause with Daemon thread in PythonPython中带有守护线程的finally子句
【发布时间】:2020-05-17 01:33:10
【问题描述】:

我在 Visual Studios 2019 上试过这个

import threading, time

def thread_func():
    try:
        print('thread start')
        time.sleep(4)
    finally:
        print('thread finish')


print('main start')
t=threading.Thread(target=thread_func,daemon=True)
t.start()
time.sleep(2)
print('main finish')

输出

main start
thread start
main finish

The documentation 声明 finally 子句总是执行,那么这是不合规还是规则的一些奇怪的例外?

【问题讨论】:

    标签: python multithreading python-multithreading finally


    【解决方案1】:

    您的父进程在您的线程可以完成执行之前完成。这就是为什么它永远不会到达“线程完成”部分。

    您可以使用 join() 告诉您的进程在终止之前等待所有线程完成执行。

    import threading, time
    
    def thread_func():
        try:
            print('thread start')
            time.sleep(4)
        finally:
            print('thread finish')
    
    
    print('main start')
    t=threading.Thread(target=thread_func,daemon=True)
    t.start()
    time.sleep(2)
    t.join()                 # Wait for threads to finish their work
    print('main finish')
    

    【讨论】:

    • 这是标准行为吗?
    • 正确。线程是绑定的进程。如果一个线程的父进程终止,该线程将随之终止。你是正确的,“最终”块总是执行......只要线程/进程实际上仍在运行以执行它。 :)
    猜你喜欢
    • 2011-10-07
    • 1970-01-01
    • 1970-01-01
    • 2012-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多