我正在通过子进程执行curl命令。此curl命令在另一台服务器上启动视频处理,并等待响应。完成此过程后,远程服务器将返回json对象。我正在使用poll()值检查子进程的状态,该值为None - 进程未完成,0进程成功完成,1-表示错误。
如果处理在远程服务器上花费大约30分钟或更少,我得到正确的响应,但如果处理花费更多时间,我只得到无值,即使我可以看到远程服务器已经完成处理并已经返回了json对象。
任何人都可以告诉我,poll()可能的原因可能是在一定时间后仅返回None。提前谢谢。
我的Popen对象是:
object = subprocess.Popen(str(curlCmd), shell=True,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
我每隔2秒就调用object.poll()
来检查过程是否成功完成。
答案 0 :(得分:4)
在Popen.poll中,您似乎可以尝试使用此链接中列出的解决方案。 http://www.gossamer-threads.com/lists/python/bugs/633489
答案 1 :(得分:2)
.poll() is None
表示孩子仍在跑步。
curl
进程可能会在它填满stdout或stderr OS管道缓冲区(我的Linux机箱大约64K)后立即挂起,除非你从管道末端读取。
当你等待孩子完成时,孩子会等你排空管道缓冲区 - 死锁。来自the subprocess
docs:
使用
.wait()
或stdout=PIPE
时,此[stderr=PIPE
]会陷入僵局 进程为管道生成足够的输出,以阻止等待 为OS管道缓冲区接受更多数据。使用Popen.communicate()
当使用管道来避免这种情况时。
您可以使用线程async.io同时使用管道。
答案 2 :(得分:0)
最后我最终使用PyCurl而不是创建子进程并通过它调用curl命令。它似乎是一个提出的问题位子进程,其中.poll方法在一定时间后没有返回,原因仍然不清楚。如果您正在运行长进程,我想通知正在使用subprocess - poll方法(没有等待/通信)的人知道它。谢谢J.F. Sebastian和Pranav的指示。
答案 3 :(得分:0)
在python 2.7中,可能3.x可以使用:
object._internal_poll(_deadstate=127)
而非常规Popen.poll()
作为解决方法。如果进程终止,这将返回127而不是None。
当然这是一个内部模块的方法,并且无法保证它在Python库更新后能够正常工作。
答案 4 :(得分:0)
To complement hegemon, this code works on 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':