【问题标题】:Python thread lifetime and handlingPython 线程生命周期和处理
【发布时间】:2021-08-28 11:51:53
【问题描述】:

我为 Python 程序创建了一个 GUI,它可以启动 4 种不同的独立计算。我希望 GUI 在后台进行计算时做出响应,因此我为每个计算创建了一个新线程。我还保留了一些关于线程的附加信息(例如,它是否应该中止计算)。

每个计算也可以运行多次(在中止或更改某些设置后),这意味着可以为每个计算创建多个线程。

我不确定是否必须使用 .join() 显式加入每个线程,或者线程是否在函数完成执行后自动终止并加入。如果程序终止后没有自动加入主线程,我不想在程序结束时得到 100 个线程。

我知道我可以使用 thread.is_alive() 来检查线程是否已完成执行,但我真的不想编写某种线程垃圾收集器(它必须在自己的新线程中运行.. . 叹息)如果我不需要的话。我已经进行了一些谷歌搜索,但是当没有明确使用 .join() 时,我找不到有关线程生命周期的文档。

【问题讨论】:

    标签: python multithreading user-interface


    【解决方案1】:

    您的主线程可以退出,如果它们是守护线程,它们将被不干净地杀死。

    线程可以随时退出,在这种情况下加入将立即返回。

    如果它们不是守护线程,则存在隐式连接 - 但除非您要求它们终止,否则它们将继续运行,直到它们正在执行的操作完成。

    文档说:“当只剩下守护线程时,整个 Python 程序退出”

    并且:注意:守护线程在关闭时突然停止。它们的资源(如打开的文件、数据库事务等)可能无法正常释放。如果您希望线程优雅地停止,请将它们设为非守护进程并使用合适的信号机制,例如事件

    发件人:https://docs.python.org/3/library/threading.html

    但是,如果您要求线程合作终止,那么您应该加入它们,因为您想确保它们干净地完成。这确实让您有责任设计线程,以便它们在请求时及时终止(即不会过度欺骗用户)——但这就是线程的工作方式,不是吗。

    【讨论】:

    • 这基本上意味着我必须创建一个自动线程处理程序。我能想到的最简单的方法是每个函数只允许一个活动线程(使用信号(最简单的方法是跟踪线程状态的全局变量,在 while 循环中检查而不是使用 for 循环) )。当 tkinter 窗口被销毁时,所有信号都会告诉计算终止并在所有信号上应用连接。这似乎是一种可行的方法,还是有更好的方法来处理这个问题?
    • 一个(可能是全局的)变量来保存线程列表,以及请求它们停止的统一机制,似乎是明智的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-06-12
    • 2019-02-02
    • 2011-02-19
    • 1970-01-01
    • 2019-09-11
    • 2016-12-14
    • 1970-01-01
    相关资源
    最近更新 更多