【问题标题】:Using subprocess module to work in parallel (Multi-process)使用子进程模块并行工作(多进程)
【发布时间】:2015-07-15 12:02:17
【问题描述】:

python 中的多处理新手,请考虑您具有以下功能:

def do_something_parallel(self):
    result_operation1 = doit.main(A,B)    
    do_something_else(C)

现在的重点是我希望doit.main 在另一个进程中运行并且是非阻塞,因此 do_something_else 中的代码将在第一个在另一个进程中启动后立即运行。

  1. 如何使用 python subprocess 模块做到这一点?
  2. 子处理和创建新进程之间有区别吗?为什么我们需要其他进程的子进程?

注意:我不想在这里使用多线程方法..

编辑:我想知道是否禁止在同一个函数中使用subprocess modulemultiprocess module
我想要这个的原因是我有两件事要运行:首先是一个 exe 文件,其次是一个函数,每个都需要它自己的进程。

【问题讨论】:

  • 为什么不想使用多处理?如果要运行多个进程,请使用不会阻塞的 subprocess.Popen
  • 我们是否可以选择将函数作为子进程运行,而不会阻塞?
  • 您可以使用 subprocess.Popen 各种方式运行它们,但我真的认为多处理会是更好的方法
  • 太好了,你能不能参考一下编辑部分,我想听听你的想法
  • 这不是被禁止的,但是,如果你只是想让 Popen 读/写是异步的,那么多处理就有点过分了。对异步 IO 使用线程。如果你没有使用过 python 线程,那真的没那么糟糕。

标签: python linux python-2.7 multiprocessing subprocess


【解决方案1】:

如果你想在单独的进程中运行 Python 代码,你可以使用multiprocessing module:

import multiprocessing

if __name__ == "__main__":
    multiprocessing.Process(target=doit.main, args=[A, B]).start()
    do_something_else() # this runs immmediately without waiting for main() to return

不知道是否禁止在同一个函数中使用子进程模块和多进程模块?

没有。您可以在同一个函数中同时使用subprocessmultiprocessing(此外,multiprocessing 可以使用subprocess 在内部启动其工作进程)。

我想要这个的原因是我有两个东西要运行:第一个是一个 exe 文件,第二个是一个函数,每个都需要它自己的进程。

你不需要multprocessing 来运行外部命令而不阻塞(显然,在它自己的进程中); subprocess.Popen()就够了:

import subprocess

p = subprocess.Popen(['command', 'arg 1', 'arg 2'])
do_something_else() # this runs immediately without waiting for command to exit
p.wait() # this waits for the command to finish

【讨论】:

    【解决方案2】:

    如果“工作”进程是可执行文件,那么 Subprocess.Popen 绝对是您想要的。当您需要异步发生时,您需要线程,如果您想利用多核来提高性能,则需要多处理(尽管您可能会发现自己在处理异步的同时也在使用线程多个并行进程的输出)。

    多处理的主要限制是传递信息。当产生一个新进程时,python 解释器的一个完整的单独实例将使用它自己的独立内存分配启动。这样做的结果是一个进程更改的变量不会被其他进程更改。对于此功能,您需要共享内存对象(也由多处理模块提供)。我已经完成的一个实现是一个父进程,它启动了几个工作进程并同时向它们传递了一个输​​入队列和一个输出队列。给子进程的函数是一个循环,旨在对从输入队列中提取的输入进行一些计算,然后将它们吐出到输出队列。然后,我指定了一个孩子会识别的特殊输入来结束循环并终止进程。

    在您的编辑中 - Popen 将并行启动另一个进程,多处理也是如此。如果您需要子进程与可执行文件通信,请务必以某种方式将文件流句柄传递给子进程。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-14
      • 1970-01-01
      • 2020-01-11
      • 2017-05-31
      • 2013-06-25
      • 1970-01-01
      相关资源
      最近更新 更多