【问题标题】:Python thread or process model where child thread or process can survive parent?子线程或进程可以在父线程中生存的Python线程或进程模型?
【发布时间】:2019-06-03 03:55:35
【问题描述】:

这是一个设计问题,涉及使用线程与多进程的 python 脚本。据我了解,使用 threading 模块生成线程无法在父线程(即进程)终止后继续存在。父线程必须要么进行连接(即等待超时不承受),要么退出,如果没有连接,则在父退出时子线程终止。这是由于线程的共享资源模型,对吧?

而多处理模块在生成进程时可以生存,即继续完成,无论创建它的父进程是退出还是终止。这当然假设父进程从未调用过连接来完成子进程。

【问题讨论】:

    标签: python python-multiprocessing


    【解决方案1】:

    threadingmultiprocessing 都旨在实现程序内的并行性。他们的目标不是启动独立流程。因此,在准备关闭解释器期间,这两个包都会隐式终止它们的并行执行路径。

    线程是进程的子集,它们的寿命不能超过创建它们的进程。
    使用线程模块中的函数_shutdown() 在解释器关闭时隐式连接活动的非守护线程。此函数在 Python 解释器生命周期的最终例程中为 called
    守护线程仅以解释器进程结束。

    如果通过multiprocessing 创建的进程在解释器准备关闭时仍处于活动状态,它们将由_exit_function() 终止,即registered as exit handler 通过atexit。类似于threadingmultiprocessing 加入非守护子进程;在 daemonic childs 上,terminate() 被调用。

    如果您想从 Python 程序启动进程并在之后退出该程序,请使用 subprocess.Popen。如果您使用的是 POSIX 平台,您可能还想看看python-daemon

    【讨论】:

    • 感谢非常好的解释。我想我也可以使用变体 os.fork,但这根本不是一个优雅的解决方案,而且也有其自身的问题。
    猜你喜欢
    • 2022-11-02
    • 1970-01-01
    • 1970-01-01
    • 2023-03-07
    • 2021-12-31
    • 2012-08-02
    • 1970-01-01
    • 2018-04-06
    • 1970-01-01
    相关资源
    最近更新 更多