subprocess.Popen使用Python3挂起〜70秒?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了subprocess.Popen使用Python3挂起〜70秒?相关的知识,希望对你有一定的参考价值。
在我的程序中,我具有用于在shell中执行命令的实用程序功能,这是它的简化版本:
def run_command(cmd):
s = time.time()
print('starting subprocess')
proc = subprocess.Popen(cmd.split(),
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
universal_newlines=True)
print('subprocess started after (0) seconds'.format(time.time() - s))
我的程序从不同线程使用此功能来执行命令。有时,“ Popen”行大约需要70秒才能完成。我的意思是,每天在不同的程序运行中,成千上万次调用会发生约4-5次。据我所知,Popen是非阻塞的。对我来说,很奇怪的是,它确实需要花费大约70秒才能启动。重要的是要注意,在发生这种情况时,我还有3-4个其他线程正在循环中等待:
while some_counter > 0:
time.sleep(0.5)
他们这样做最多60秒。他们放弃并完成流程后,我会再等约14秒钟,直到“ Popen”通话结束。从某些线程并行运行“ Popen”到在“等待循环”中运行其他线程是否有问题?
更新1:我现在看到从Fedora27 + Python3.6切换到Fedora31 + python3.7之后,这个问题开始了。
您应该用strace
包装Python应用程序,以查看卡住时它试图执行的系统调用。例如:
strace /path/to/your/python/app
[您还应确认您的命令没有被卡住,例如通过在Python外部运行它。
以上是关于subprocess.Popen使用Python3挂起〜70秒?的主要内容,如果未能解决你的问题,请参考以下文章
是否可以将subprocess.Popen的stdout重新连接到sys.stdout? (python3)
从 subprocess.Popen 将参数传递给 argparse
为啥 subprocess.Popen 参数长度限制小于操作系统报告的长度?