一、多進程Processpython
調用方法:app
from multiprocessing import Process,freeze_support import time def f(i): time.sleep(1) print(i) # 這裏若是不寫if __name__ == "__main__":的話會報freeze_support()錯誤 if __name__ == "__main__": for i in range(10): p = Process(target=f,args=(i,)) p.start() print("end")
二、隊列Queuedom
Queue爲先進先出,get()一次,Queue裏的那個被get的值會被拿走,當隊列爲空時get()方法會阻塞,async
調用方法:函數
from multiprocessing import Process,Queue import time def f(i,q): time.sleep(1) q.put(i) if __name__ == "__main__": q = Queue() for i in range(2): p = Process(target=f,args=(i,q,)) p.start() for i in range(2): print(q.get())
2.1 Queue中的數據是能夠在子進程間共享的。對象
from multiprocessing import Process,Queue import random import os def f(q): if q.qsize() != 0: print("pid:%s get %s from queue"%(os.getpid(),q.get())) else: n = random.randrange(1,10) print("pid:%s put %s into the queue"%(os.getpid(),n)) q.put(n) if __name__ == "__main__": print("main pid is:%s"%os.getpid()) q = Queue() p = Process(target=f,args=(q,)) p.start() p1 = Process(target=f,args=(q,)) p1.start()
第一個進程放入數據,第2個進程能夠取到,運行結果以下:blog
main pid is:7300 pid:5208 put 2 into the queue pid:6104 get 2 from queue
三、Pipe隊列
示例: from multiprocessing import Process,Queue,Pipe import time def f(i,conn): conn.send(i*10) if __name__ == "__main__": parent, child = Pipe() for i in range(2): p = Process(target=f,args=(i,child)) p.start() for i in range(2): print(parent.recv())
四、Manager,進程間數據共享進程
若是有子進程在使用Manage()對象時,在父進程不能使用這個對象,因此要等全部子進程結束即需使用p.join()後方可在父進程使用Manage()的對象。ip
若是這裏註釋join()會報:FileNotFoundError: [WinError 2] 系統找不到指定的文件。
from multiprocessing import Process,Manager import time def f(d,l,i): time.sleep(5-i) # 最後起的進程睡眠最少時間,因此父進程不能簡單的使用p.join(),而是要把p加入p_list中,而後循環p_list,並使用join()方法 d[i] = i*10 l.append(i*100) if __name__ == "__main__": with Manager() as m: d = m.dict() l = m.list([1,2,3]) p_list = [] for i in range(5): p = Process(target=f,args=(d,l,i,)) p.start() p_list.append(p) for p in p_list: p.join() print("d:",d) print("l:",l)
五、進程池Pool
Pool滿時後面的進程會被掛起,當pool中一個進程結束時,掛起的進程會立刻開始執行。callback回調,將target的函數的teturn的值返回給callback函數的參數。
from multiprocessing import Process,Pool import time def f(i): print("begin:",i,time.time()) time.sleep(i) print("end:",i,time.time()) return i def bar(i): if i == 9: print("bar:",i) if __name__ == "__main__": pool = Pool(5) for i in range(1,10): pool.apply_async(func=f,args=(i,),callback=bar) pool.close() pool.join() #執行結果: begin: 1 1466267934.986106 begin: 2 1466267934.992107 begin: 3 1466267935.0080783 begin: 4 1466267935.0166094 begin: 5 1466267935.0236104 end: 1 1466267935.9862905 begin: 6 1466267935.9864767 end: 2 1466267936.992654 begin: 7 1466267936.9931495 end: 3 1466267938.0089972 begin: 8 1466267938.0089972 end: 4 1466267939.016981 begin: 9 1466267939.016981 end: 5 1466267940.0240061 end: 6 1466267941.9866436 end: 7 1466267943.9936304 end: 8 1466267946.0098124 end: 9 1466267948.0178423 bar: 9