【问题标题】:Python3 multiprocessing terminate vs kill vs closePython3多处理终止vs杀死vs关闭
【发布时间】:2020-03-11 00:07:57
【问题描述】:

我知道terminatekill 做了什么。 close() 是做什么的?

这是来自 python 文档的引用:

关闭 Process 对象,释放与其关联的所有资源。 如果底层进程仍在运行,则会引发 ValueError。一次 close() 成功返回,其他大多数方法和属性 Process 对象会引发 ValueError。

在我看来,这是有史以来最没用的电话:

  • 如果进程仍在运行,它什么也不做,但会失败并出现异常

  • 如果进程已经终止......它要么忙于清理,要么完成了清理,我为什么要在它上面调用一个显式的close()? (此调用的使用是否取决于操作系统?)

会不会是这个文档条目非常尴尬,不知何故,这确实意味着close() 有权终止线程,但它只在某些 python 定义的检查点处这样做?

【问题讨论】:

    标签: python python-3.x multiprocessing python-multiprocessing


    【解决方案1】:

    The issue that added that method 解释:

    multiprocessing.Process(实际上是附在它上面的_popen对象)有一个基于GC的终结器来释放系统资源(例如fds)。但是,如果能够及时释放这些资源,那就太好了。添加close() 方法可以让用户这样做。

    基本上,没有close,某些资源(用于与父级通信的文件描述符,sentinel 句柄,你有什么)只有在Process 被垃圾收集时才会关闭,这在非 CPython 解释器上,甚至在引用循环的情况下是 CPython,可能会在未来某个不确定的时间发生。

    close 的存在使您可以确保在特定时间点确定地清理资源,因此,例如,启动许多 Processes 的进程可以确保及时清理文件描述符以防止遇到ulimit 或内核施加的文件描述符限制。

    正常的用例是在.join()(或.kill().terminate())之后立即调用.close()Process最终释放资源,即使你不这样做,但它可能不会立即发生。

    【讨论】:

    • 简短回答:在.join()(或.kill().terminate())之后调用.close()。因为close()可以释放资源。
    猜你喜欢
    • 2018-08-06
    • 2019-01-17
    • 1970-01-01
    • 2018-09-10
    • 2022-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-29
    相关资源
    最近更新 更多