【发布时间】:2011-03-22 23:32:56
【问题描述】:
我确定我遗漏了一些简单的东西,但是在使用 subprocess 模块时,启动第一个子进程需要等待很长时间(> 10 秒)。第二个在第一个之后不久开始。有没有什么办法解决这一问题?代码如下:
编辑:要添加,HWAccess(在 proc.py 中)链接一个 dll。这和它有什么关系吗? EDIT2:我已经将测试归结为启动一个 SINGLE 子进程,导入 HWAccess 比直接从 cmd 提示符运行 proc.py 花费的时间要长得多。我看不出这与 dll 有什么关系,特别是如果它从 cmd 快速加载,但不是作为通过 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 秒到达第一个“进程开始...”,第二个进程随即打印“进程开始...”。然后有大约 30 秒的暂停来导入 HWAccess(在单个进程上运行大约需要几秒钟),然后第二个进程立即打印它也已导入 HWAccess... 从那时起执行速度很快。 HWAccess 链接了一个 .dll,所以我想知道尝试导入 HWAccess 的两个进程是否会导致某种需要一段时间才能协商的竞争条件。
【问题讨论】:
-
为什么要使用子进程调用另一个Python脚本?使用
import导入您的脚本。 -
您的子进程代码没有任何内容会导致 10 秒延迟。 HWAccess 是否有任何昂贵或时间敏感的初始化?直接运行脚本时
proc.py需要多长时间才能打印? -
HWAccess 是一个类的集合,但是作为一个正常进程运行它会很快导入(实例化其中一个类确实需要一些时间,但我已经在 proc.py 的顶部打印了一个检查启动子进程的开销)。
-
导入 HWAccess 后,执行时间似乎正常。
-
实际上,启动时间的大部分时间似乎都在子流程中的 3 次导入中。
标签: python subprocess popen