subprocess.popen的poll方法,长流程返回None

2024-04-23 07:40:05 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在通过子进程执行curl命令。这个curl命令在另一个服务器上启动视频处理,并等待响应。完成该过程后,远程服务器将返回json对象。我正在使用poll()值检查子进程的状态,该值为None-process not completed、0-process completed successfully和1-for error。

如果在远程服务器上处理大约需要30分钟/或更少时间,我将得到正确的响应,但是如果处理需要更多时间,我将只得到一个值,即使我可以看到远程服务器已完成处理并已返回json对象。

有谁能告诉我,poll()在一定时间后只返回None的可能原因是什么。提前谢谢你。

我的目标是:

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

每隔2秒我就会调用object.poll(),检查进程是否成功完成。


Tags: 对象命令服务器nonejson远程object进程
3条回答

在Python2.7和可能的3.x中可以使用:

object._internal_poll(_deadstate=127)

而不是常规的解决办法。如果进程终止,则返回127而不是None。

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

Popen.poll中似乎有一个已知问题,您可以尝试使用此链接中概述的解决方案。http://www.gossamer-threads.com/lists/python/bugs/633489

.poll() is None表示子项仍在运行。

只要进程填满其stdout或stderr OS管道缓冲区(在我的Linux机器上大约64K),它就可能挂起,除非您从管道的末端读取。

也就是说,当您等待子进程完成时,子进程等待您耗尽管道缓冲区--死锁。来自the ^{} docs

This[.wait()] will deadlock when using stdout=PIPE or stderr=PIPE and the child process generates enough output to a pipe such that it blocks waiting for the OS pipe buffer to accept more data. Use Popen.communicate() when using pipes to avoid that.

可以使用线程async.io并发地使用管道。

相关问题 更多 >