首页 > 解决方案 > 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 后开始的。

标签: linuxsubprocesspython-3.7python-multithreadingpopen

解决方案


推荐阅读