使用子模块并行(多处理)的工作(Using subprocess module to work in

2019-10-23 21:45发布

新的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文件,和第二函数,每个需要它自己的进程。

Answer 1:

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

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


Answer 2:

Subprocess.Popen绝对是你想要什么,如果“工人”的过程是可执行的。 线程是你需要什么,当你需要的东西异步发生,多是你所需要的,如果你想充分利用多内核的性能改进(虽然你可能会发现自己也使用线程在同一时间,因为他们处理异步多个并行处理的输出)。

多处理的主要限制是传递信息。 当一个新的进程产生,Python解释器的整个单独的实例启动,它有自己独立的内存分配。 这样做的结果是通过一个过程变量改变将不改变为其他处理。 对于这个功能,你需要共享内存对象(也由多处理器模块提供)。 一种实现我做的是,开始的几个工作进程,并通过他们两个输入队列和输出队列中的父进程。 给孩子处理的功能是专门做从输入队列拉到输入一些计算一个循环,然后将它们吐出到输出队列。 那么我指定的,孩子会认识到结束循环和终止过程中的特殊输入。

您的编辑 - POPEN将同时启动其他程序,如意志多。 如果您需要子进程与可执行沟通,一定要通过文件流处理子进程莫名其妙。



文章来源: Using subprocess module to work in parallel (Multi-process)