队列
(1)简单的队列:
import queue #线程queue q = queue.Queue() q.put('a') q.put('b') q.put('c') q.put('d') q.put('e') print(q.qsize( )) print(q.get()) print(q.qsize( ))
(2)多个进程(主进程和子进程)之间相互传递数据,但是不共享数据:
from multiprocessing import Queue,Process '''多个进程(主进程和子进程)相互传递数据,但是不共享数据''' def f(qq): qq.put('你好') if __name__ == '__main__': q = Queue() p = Process(target=f,args=(q,)) #起一个子进程 p.start() print('>>',q.get()) p.join()
(3)
管道的方式 多个进程(主进程和子进程)之间相互传递数据,但是不共享数据:
from multiprocessing import Process,Pipe #(Pipe() 管道) def child(conn): conn.send('hello world!') conn.send('hello world too!') print('儿子收到父亲来电:',conn.recv()) conn.close() if __name__ == '__main__': father_conn,child_conn = Pipe() #管道有两端,一端父亲一端儿子 father_conn.send('儿砸') p = Process(target=child,args=(child_conn,)) #把儿子传给子进程,父亲是主进程 p.start() print('父亲收到儿子来电:',father_conn.recv()) print('父亲收到儿子来电:',father_conn.recv()) p.join()
(4)多个进程(主进程和子进程)之间真正的数据共享:
from multiprocessing import Process,Manager import os def f(d,l): d[os.getpid()] = os.getpid() #将进程号当作 key 和value传到字典里边 l.append(os.getppid()) print(l) if __name__ == '__main__': with Manager() as manager: d = manager.dict() #生成一个字典,可在多个进程之间贡献 l = manager.list(range(3)) #生成一个列表,事先存有5个元素,可在多个进程间共享 p_list = [] #存放每个进程 for i in range(10): p = Process(target=f,args=(d,l)) #启动子进程 p.start() p_list.append(p) for res in p_list: #等待结果 res.join() print(d) print(l)
(5)进程锁 用法和线程锁基本一样:
from multiprocessing import Process,Lock def f(l,i): l.acquire() print('hello world',i) l.release() if __name__ == '__main__': l = Lock() #进程锁需要将锁传进去 for i in range(10): p = Process(target=f,args=(l,i,)) p.start()