Zol*_* K. 8 python multiprocessing python-3.x python-multiprocessing
我得到了什么terminate和kill做。有什么作用close()?
这是python文档中的引用:
关闭 Process 对象,释放与其关联的所有资源。如果底层进程仍在运行,则会引发 ValueError。一旦 close() 成功返回,Process 对象的大多数其他方法和属性将引发 ValueError。
在我看来,这是有史以来最无用的调用:
如果进程仍在运行,它什么都不做,但失败并出现异常
如果进程已经终止......它要么忙于清理,要么完成了清理,为什么我要close()在它上面调用一个显式?(此调用的使用是否取决于操作系统?)
是不是这个 doc 条目非常尴尬,不知何故它确实意味着close()有能力终止一个线程,但它只在某些 python 定义的检查点这样做?
Sha*_*ger 10
添加该方法的问题解释了:
multiprocessing.Process(其实就是_popen附在它上面的对象)有一个基于GC的finalizer来释放系统资源(比如fds)。但是,能够及时释放这些资源会很好。添加一个close()方法会让用户这样做。
基本上,如果没有close,某些资源(用于与父级通信的文件描述符、sentinel句柄、你有什么)仅在Process垃圾收集时关闭,这在非 CPython 解释器上,甚至在引用循环的情况下,CPython 可能发生在未来某个不确定的时间。
的存在close可以确保在特定的时间点肯定会清理资源,因此,例如,启动多个Processes的进程可以确保及时清理文件描述符,以防止遇到ulimit或内核强加的文件描述符限制.
正常的用例是.close()在.join()(or.kill()或.terminate())之后立即调用;该Process会最终释放资源,即使你不这样做,但它可能不会立即发生。