进程
Python中的多线程无法利用多核优势 , 所以如果我们想要充分地使用多核CPU的资源 , 那么就只能靠多进程了
multiprocessing模块中提供了Process , Queue , Pipe , Lock , RLock , Event , Condition等组件 , 与threading模块有很多相似之处
1.创建进程
from multiprocessing import Process import time def func(name): time.sleep(2) print('hello',name) if __name__ == '__main__': p= Process(target=func,args=('derek',)) p.start() # p.join() print('end...')
2.进程间通讯
(1)Queue
不同进程间内存是不共享的,要想实现两个进程间的数据交换。进程间通信有两种主要形式 , 队列和管道
from multiprocessing import Process, Queue #Queue是进程排列 def f(test): test.put('22') #通过创建的子进程往队列添加数据,实线父子进程交互 if __name__ == '__main__': q = Queue() #父进程 q.put("11") p = Process(target=f, args=(q,)) #子进程 p.start() p.join() print("取到:",q.get_nowait()) print("取到:",q.get_nowait()) #父进程在创建子进程的时候就把q克隆一份给子进程 #通过pickle序列化、反序列化,来达到两个进程之间的交互 结果: 取到: 11 取到: 22
(2)Pipe(管道)
The Pipe() function returns a pair of connection objects connected by a pipe which by default is duplex (two-way).
from multiprocessing import Process, Pipe def f(conn): conn.send('11') conn.send('22') print("from parent:",conn.recv()) print("from parent:", conn.recv()) conn.close() if __name__ == '__main__': parent_conn, child_conn = Pipe() #生成管道实例,可以互相send()和recv() p = Process(target=f, args=(child_conn,)) p.start() print(parent_conn.recv()) # prints "11" print(parent_conn.recv()) # prints "22" parent_conn.send("33") # parent 发消息给 child parent_conn.send("44") p.join()