1、为什么需要多进程
由于GIL的存在,python中的多线程其实并不是真正的多线程,如果想要充分地使用多核CPU的资源,在python中大部分情况需要使用多进程。
multiprocessing包是Python中的多进程管理包。与threading.Thread类似,它可以利用multiprocessing.Process对象来创建一个进程。该进程可以运行在Python程序内部编写的函数。该Process对象与Thread对象的用法相同,也有start(), run(), join()的方法。此外multiprocessing包中也有Lock/Event/Semaphore/Condition类 (这些对象可以像多线程那样,通过参数传递给各个进程),用以同步进程,其用法与threading包中的同名类一致。所以,multiprocessing的很大一部份与threading使用同一套API,只不过换到了多进程的情境。
2、多进程的创建方法
1 import multiprocessing 2 import time 3 4 5 def run(name): 6 time.sleep(2) 7 print("hello", name) 8 9 10 # 多进程 11 if __name__ == "__main__": 12 for i in range(10): 13 p = multiprocessing.Process(target=run, args=("druid %s" % i, )) 14 p.start() 15 p.join()
3、进程间通信
不同进程间内存是不共享的,要想实现两个进程间的数据交换,可以用以下方法:
3.1、Queues
1 from multiprocessing import Queue, Process 2 import os 3 4 5 def f(pq): 6 pq.put([42, None, "druid"]) 7 print("子进程的父进程ID:", os.getppid()) 8 print("子进程的当前进程ID:", os.getpid()) 9 10 11 if __name__ == "__main__": 12 print("父进程ID:", os.getppid()) 13 print("当前进程ID:", os.getpid()) 14 q = Queue() 15 p = Process(target=f, args=(q,)) 16 p.start() 17 print(q.get()) 18 19 p.join()
3.2、Pipes
The Pipe()
function returns a pair of connection objects connected by a pipe which by default is duplex (two-way). For example:
1 from multiprocessing import Process, Pipe 2 3 4 def f(conn): 5 conn.send("