Mutilprocessing 包提供本地和远程并发性,通过子进程而不是线程有效地侧移“全局解释器锁”。进程是通过创建一个Process对象,然后调用start方法产生
上下文启动法:
- spawn:父进程启动一个新的python解释器,子进程只会进行进程对象run()
- fork:父进程os.fork() 来分叉python解释器,子进程与父进程有效性相同,父进程所有资源都由子进程继承。(多线程间存在安全性问题)
- forkserver:当使用此方法时,服务进程启动。无论何时需要新进程,父进程都会连接到服务器并请求它分一个新子进程。forkserver是单线程的,因此可以安全使用os.fork()。没有不必要的资源被继承
import mutilprocessing as mp
mp.set_start_method(‘spawn’) 只能使用一次
mp.get_context(‘spawn’) 可以多次使用
进程间交换对象
Mutilprocessing 支持两种进程间通信信道:
- 队列(queue):
- 类似克隆,队列是线程和进程(安全)
- 管道(pipe):
- 函数pipe()返回一对由管道连接的连接对象,默认情况下是双向的。
a, b = pipe()
通过返回两个对象表示管道两端,每个对象都有send()和rec()两种方法。
如果两进程或两线程试图同时读取或同时写入管道了另一端,数据可能损坏。