8

我正在通过子进程执行 curl 命令。此 curl 命令在另一台服务器上启动视频处理,并等待响应。该过程完成后,远程服务器返回 json 对象。我正在使用 poll() 值检查子进程的状态,即 None - 进程未完成,0- 进程成功完成,1- 错误。

如果远程服务器上的处理时间约为 30 分钟/或更短,我会得到正确的响应,但如果处理时间更长,我只会得到 None 值,即使我可以看到远程服务器已经完成处理并且已经返回 json 对象。

谁能告诉我, poll() 在特定时间后只返回 None 的可能原因是什么。先感谢您。

我的 Popen 对象是:

object = subprocess.Popen(str(curlCmd), shell=True,
                           stdout=subprocess.PIPE,
                           stderr=subprocess.PIPE)

object.poll()每 2 秒调用一次以检查该过程是否成功完成。

4

4 回答 4

4

.poll() is None表示孩子还在跑。

除非您从管道的末端读取,否则该curl 进程可能会在其填充其 stdout 或 stderr OS 管道缓冲区(在我的 Linux 机器上大约 64K)时挂起。

也就是说,当您等待孩子完成时,孩子等待您排空管道缓冲区 - deadlock。从文档_subprocess

this[ .wait()] 在使用stdout=PIPEor时会死锁,stderr=PIPE并且子进程会向管道生成足够的输出,从而阻塞等待 OS 管道缓冲区接受更多数据。在使用Popen.communicate() 管道时使用以避免这种情况。

您可以使用线程 async.io 来同时使用管道。

于 2015-11-06T09:24:12.313 回答
1

在 python 2.7 和可能的 3.x 中可以使用:

object._internal_poll(_deadstate=127)

而不是常规Popen.poll()的解决方法。如果进程终止,这将返回 127 而不是 None。

当然,这是一个内部模块的方法,不能保证在 Python 的库更新后它会起作用。

于 2012-10-25T07:17:11.610 回答
1

为了补充 hegemon,此代码适用于 2.7:

process = subprocess.Popen(cmd, cwd=current_dir, shell=True, stdout=subprocess.PIPE, stdin=subprocess.PIPE, stderr=subprocess.PIPE )
process._internal_poll(_deadstate='dead')

while timeout > 0:
  if process.poll() is not 'dead':
于 2016-08-23T15:37:03.190 回答
0

最后我最终使用 PyCurl 而不是创建一个子进程并通过它调用 curl 命令。这似乎是一个引发的问题位 subprocess ,其中 .poll 方法在一定时间后没有返回,原因尚不清楚。如果您正在运行长进程,我想通知正在使用 subprocess-poll 方法(无需等待/通信)的人要注意这一点。感谢 JF Sebastian 和 Pranav 的指导。

于 2012-08-17T18:00:34.393 回答