新的Python到多处理,认为有以下功能:
def do_something_parallel(self):
result_operation1 = doit.main(A,B)
do_something_else(C)
现在的问题是,我想doit.main
到另一个进程中运行,并且是非阻塞 ,所以第一个已经在另一个进程已经启动之后do_something_else的代码将立即运行。
- 我该怎么办使用python它
subprocess
模块? - 是否有子处理,并预留创建新的进程到另一个,为什么我们需要其他进程的子进程之间的区别吗?
注 :我不想在这里使用多线程技术..
编辑 :我不知道是否使用subprocess module
和multiprocess module
在同一个函数被禁止?
原因我想这是我要运行两件事情:首先一个exe文件,和第二函数,每个需要它自己的进程。
如果你想在一个单独的进程中运行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
我不知道是否使用相同功能的子模块和多进程模块被禁止?
不可以,你可以同时使用subprocess
和multiprocessing
在同一个函数(而且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
Subprocess.Popen绝对是你想要什么,如果“工人”的过程是可执行的。 线程是你需要什么,当你需要的东西异步发生,多是你所需要的,如果你想充分利用多内核的性能改进(虽然你可能会发现自己也使用线程在同一时间,因为他们处理异步多个并行处理的输出)。
多处理的主要限制是传递信息。 当一个新的进程产生,Python解释器的整个单独的实例启动,它有自己独立的内存分配。 这样做的结果是通过一个过程变量改变将不改变为其他处理。 对于这个功能,你需要共享内存对象(也由多处理器模块提供)。 一种实现我做的是,开始的几个工作进程,并通过他们两个输入队列和输出队列中的父进程。 给孩子处理的功能是专门做从输入队列拉到输入一些计算一个循环,然后将它们吐出到输出队列。 那么我指定的,孩子会认识到结束循环和终止过程中的特殊输入。
您的编辑 - POPEN将同时启动其他程序,如意志多。 如果您需要子进程与可执行沟通,一定要通过文件流处理子进程莫名其妙。