Python: subprocess.Popen() 第一次实例化非常慢

3 投票
1 回答
2759 浏览
提问于 2025-04-16 14:13

我觉得我可能漏掉了什么简单的东西,但在使用subprocess模块时,启动第一个子进程的等待时间非常长(超过10秒)。第二个子进程在第一个之后不久就启动了。有没有什么办法可以解决这个问题?下面是代码:

补充:HWAccess(在proc.py中)链接了一个dll。这可能与此有关吗?

补充2:我把测试简化为只启动一个子进程,发现导入HWAccess的时间明显比直接从命令提示符运行proc.py要长。我不明白为什么从命令行加载得很快,但通过test.py作为子进程却慢。

test.py:

import subprocess
import os
import time

print 'STARTING'
proc0 = subprocess.Popen(['python','proc.py','0'])
proc1 = subprocess.Popen(['python','proc.py','1'])

while True: 
    try: pass
    except KeyboardInterrupt: 
    os._exit(0)
except ValueError: 
    pass

proc.py:

print 'Process starting...'
import HWAccess
print 'HWAccess imported...'
import sys
print 'sys imported...'
import time
print 'time imported...'

print 'hi from ',sys.argv[1]

补充:在添加了打印语句后,第一次显示“进程启动...”大约需要5秒,第二个进程紧接着立即打印“进程启动...”。然后导入HWAccess时大约有30秒的停顿(在单独进程中只需几秒钟),第二个进程也立即打印出它已经导入HWAccess...从那以后执行就很快了。HWAccess链接了一个.dll,所以我在想两个进程尝试导入HWAccess是否会导致某种竞争条件,导致需要一些时间来解决。

1 个回答

4

我不太确定这是不是正确的方向,但我记得很久以前在启动一个进程时遇到过类似的延迟(那时候和Python没有关系),结果发现是因为我电脑上的网络设置配置得不好。启动子进程时,它需要建立进程间的通信,而这些设置可能会造成干扰。

我记得我的问题是因为机器使用了一个错误的主机名,而这个主机名在网络上没有正确配置——你能检查一下你是不是也遇到这种情况吗?如果这不是生产环境的机器,试着不设置主机名,直接用“localhost”就可以了。

撰写回答