【问题标题】:asynchronous subprocess with Popen带有 Popen 的异步子进程
【发布时间】:2012-12-03 05:37:12
【问题描述】:

使用 Windows 7 + python 2.6,我正在尝试并行运行模拟模型。我可以通过在我的文件浏览器中双击它们来启动可执行文件的多个实例。但是,使用Popen 的异步调用会导致每个连续实例中断前一个实例。对于它的价值,可执行文件将文本返回到控制台,但我不需要以交互方式收集结果。

这是我目前所处的位置:

import multiprocessing, subprocess

def run(c):
    exe = os.path.join("<location>","folder",str(c),"program.exe")
    run = os.path.join("<location>","folder",str(c),"run.dat")
    subprocess.Popen([exe,run],creationflags = subprocess.CREATE_NEW_CONSOLE)

def main():
    pool = multiprocessing.Pool(3)
    for c in range(10):
        pool.apply_async(run,(str(c),))
 pool.close()
 pool.join()

if __name__ == '__main__':
    main()

在搜索 SO 以获得解决方案后,我了解到使用多处理可能是多余的,但我需要一些方法来限制工作的核心数量。

【问题讨论】:

  • 您是否尝试使用cwd 参数为每​​个子进程指定不同的工作目录? exe 可能会将一些文件写入当前目录,从而干扰并行执行。
  • 您可以使用os.path.join 连接路径部分,而不是直接进行字符串操作
  • Popen 立即返回,因此您的脚本不会限制并行子进程的数量。您可以使用subprocess.call() 阻止直到子进程完成。
  • os.path.join,是的,当然。已更新。
  • this answer demonstrates various techniques to limit number of concurrent subprocesses:它显示基于multiprocessing.Poolconcurrent.futuresthreading + Queue 的解决方案

标签: python asynchronous multiprocessing subprocess executable


【解决方案1】:

由@J.F. 启用。 Sebastian 关于cwd 参数的评论。

import multiprocessing, subprocess

def run(c):
    exe = os.path.join("<location>","folder",str(c),"program.exe")
    run = os.path.join("<location>","folder",str(c),"run.dat")
    subprocess.check_call([exe,run],cwd=os.path.join("<location>","folder"),creationflags = subprocess.CREATE_NEW_CONSOLE)

def main():
    pool = multiprocessing.Pool(3)
    for c in range(10):
        pool.apply_async(run,(str(c),))
    pool.close()
    pool.join()

if __name__ == '__main__':
    main()

【讨论】:

  • 顺便说一句,mutiprocessing.dummy.Pool 提供了相同的接口,但使用线程而不是在这种情况下可能更合适的进程。
猜你喜欢
  • 2017-02-03
  • 2021-01-27
  • 2017-11-22
  • 1970-01-01
  • 2018-12-05
  • 1970-01-01
  • 2014-03-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多