在我的程序中,我具有用于在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外部运行它。