subprocess.Popen使用Python3挂起〜70秒?

问题描述 投票:6回答:1

在我的程序中,我具有用于在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之后,这个问题开始了。

linux subprocess python-3.7 python-multithreading popen
1个回答
0
投票

您应该用strace包装Python应用程序,以查看卡住时它试图执行的系统调用。例如:

strace /path/to/your/python/app

[您还应确认您的命令没有被卡住,例如通过在Python外部运行它。

© www.soinside.com 2019 - 2024. All rights reserved.