Avi*_*aya 6 python subprocess popen
我正在通过子进程执行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)
Run Code Online (Sandbox Code Playgroud)
我object.poll()每隔2秒就打电话一次,检查过程是否成功完成.
.poll() is None意味着孩子还在跑。
该curl 进程可能会在填满其 stdout 或 stderr OS 管道缓冲区(在我的 Linux 机器上大约 64K)后立即挂起,除非您从管道的一端读取。
也就是说,当您等待子进程完成时,子进程等待您耗尽管道缓冲区 -死锁。来自文档subprocess:
当使用or并且子进程生成足够的输出到管道时,此[
.wait()]将死锁,从而阻止等待操作系统管道缓冲区接受更多数据。使用管道时使用 以避免这种情况。stdout=PIPEstderr=PIPEPopen.communicate()
您可以使用线程、async.io 来同时使用管道。
在Popen.poll中似乎是一个已知问题,您可以尝试使用此链接中概述的解决方案吗?http://www.gossamer-threads.com/lists/python/bugs/633489
最后我最终使用 PyCurl 而不是创建子进程并通过它调用curl 命令。这似乎是一个提出的问题位 subprocess ,其中 .poll 方法在一定时间后不返回任何内容,原因仍不清楚。如果您正在运行长进程,我想告知使用子进程轮询方法(无需等待/通信)的人们要注意这一点。感谢 JF Sebastian 和 Pranav 的指导。