在p.terminate()之后,怎么可能立即获得p.exitcode = None?

时间:2020-09-05 14:15:51

标签: python multiprocessing

以下代码有时会作为错误返回,表明python无法将$ curl -v https://www.google.com ... < HTTP/1.1 200 OK 与整数进行比较。

这意味着None即使在p.exitcode之后也是None。但是,docs中指出

如果进程尚未终止,则此(退出代码)将为p.terminate()

这怎么可能?

代码:

None

1 个答案:

答案 0 :(得分:1)

terminate() doesn't literally terminate the process

在POSIX操作系统上,该方法将SIGTERM发送给子级。在Windows上,调用Win32 API函数TerminateProcess()来停止子级。

这两个操作都是异步的:它们请求终止进程,但不等待实际终止。

要等待实际终止(保证exitcode的可用性),请使用wait()

if p.is_alive:
    p.terminate()
    p.wait()

wait()返回退出代码,由于Python 3.3带有timeout参数,因此您可以将代码缩短为:

for j in range(3):
    p = multiprocessing.Process(...)
    p.start()
    exitcode = p.wait(180)
    if exitcode >= 0:
        break