我正在使用Popen
来维护Python程序中的子进程池。我的程序中有一些自然点可以执行“清理” - 在这些点上我调用Popen.poll()
来确定特定进程是否仍在运行,如果没有,我从池中删除它的Popen
对象,收回它正在使用的任何资源。
是否需要调用Popen.wait()
才能执行某种语言或操作系统级别的清理?对Popen.poll()
的调用已确定进程已终止,甚至设置了returncode
属性。是否还有其他理由可以致电Popen.wait()
?
答案 0 :(得分:3)
不,如果您致电wait
,则无需致电poll
。除了wait
无限等待外,它们基本上都做同样的事情。
poll
:
if self.returncode is None:
if _WaitForSingleObject(self._handle, 0) == _WAIT_OBJECT_0:
self.returncode = _GetExitCodeProcess(self._handle)
return self.returncode
wait
:
if self.returncode is None:
_subprocess.WaitForSingleObject(self._handle,
_subprocess.INFINITE)
self.returncode = _subprocess.GetExitCodeProcess(self._handle)
return self.returncode
这是subprocess
模块的Windows实现代码,但所有其他模块应遵循相同的规则。
在MacOS X上,我假设Linux的实现是相同的,它们都会调用os.waitpid
。