【问题标题】:Is it safe to ignore the return value of Popen?忽略 Popen 的返回值是否安全?
【发布时间】:2021-02-03 00:15:45
【问题描述】:

我需要我的 python (2.7) 程序启动一个子进程,并在子进程运行时继续处理。所以我不希望主程序等待子进程终止。

这显然是通过返回类对象的 Popen 实现的。

忽略 Popen 的返回值是否安全?

垃圾收集器会删除 popen 对象吗?子进程终止后对象垃圾回收了吗?

我无法用 python 文档回答这些问题。

请注意,由于我无法控制的限制,我使用的是 python 2.7。

【问题讨论】:

    标签: python python-2.7 subprocess


    【解决方案1】:

    在类 Unix 系统上,未能在孩子上wait() 会创建僵尸。这是一个问题,因为您正在污染并最终耗尽您的进程表。见https://en.wikipedia.org/wiki/Wait_(system_call)

    如果您想在程序完成时终止您的子进程,请执行此操作。这正是您需要从Popen() 保存结果的原因。

    child = Popen(['sleep', '1234567890'])
    # ... code happens ...
    child.kill()
    child.wait()
    

    重申一下,Popen() 返回的 Python 对象当然会随着 Python 消失而消失;问题是您还需要清理它所代表的实际操作系统进程。

    【讨论】:

    • 感谢您指出这一点。这正是我想要避免的。我不想打电话给child.kill()。我想我需要创建一个分离的进程。
    • FWIW 除非你在一个长生命周期的循环中生成子进程,一旦父进程死亡,子进程将重新成为 PID1 的父进程,PID1 将收获它的僵尸,所以等待子进程几乎是不可能的一个要求。
    • 杀死孩子也不等待()他们,所以它专门创建僵尸。
    • @Masklinn 谢谢,添加了缺失的wait()(本来想查一下,但分心了)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-04
    • 2016-10-26
    • 1970-01-01
    • 1970-01-01
    • 2023-03-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多