【问题标题】:Python: first instance of subprocess.Popen() is very slowPython:subprocess.Popen() 的第一个实例非常慢
【发布时间】: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


【解决方案1】:

我不确定这是否是正确的轨道,但我记得在启动进程时看到这样的延迟(与 Python 完全无关),结果证明它们与我的一些配置错误的网络设置有关计算机。在子进程启动时,它必须设置进程间通信,这些设置可能会干扰。

我记得我的问题与使用错误的主机名有关,该主机名在网络上没有正确配置 - 你能检查一下是否是你的情况吗?如果不是生产机器,尽量不设置主机名,保留为“localhost”。

【讨论】:

    猜你喜欢
    • 2018-03-22
    • 2018-08-06
    • 1970-01-01
    • 2015-11-21
    • 1970-01-01
    • 1970-01-01
    • 2020-02-06
    • 1970-01-01
    • 2022-06-14
    相关资源
    最近更新 更多