程式的其他方法
P = Process(target=f,)
P.Pid 檢視程式號 檢視程式的名字p.name
P.is_alive() 返回一個true或者False
P.terminate() 給作業系統傳送一個結束程式的訊號
驗證程式之間是空間隔離的
from multiprocessing import Process num = 100 def f1(): global num num = 3 print(num) # 結果 3 if __name__ == `__main__`: p = Process(target=f1,) p.start() p.join() print(num) # 結果 100
守護程式
主程式的程式碼執行完畢設定為守護程式的子程式會隨之結束
P.daemon = True
import time from multiprocessing import Process def f1(): time.sleep(3) print(`xxxx`) def f2(): time.sleep(5) print(`普通子程式的程式碼`) if __name__ == `__main__`: p = Process(target=f1,) p.daemon = True p.start() p2 = Process(target=f2,) p2.start() print(`主程式結束`) # 守護程式會跟跟著父程式的程式碼執行結束,就結束
程式鎖
資料共享 manager
多程式操作共享資料(檔案內容)的時候,會造成資料不安全的問題
保證資料安全,但是犧牲了效率,加鎖的這段程式碼大家變成了(同步)序列執行的狀態,又叫同步鎖互斥鎖
兩種鎖的方式
l = Lock()
1).with l:
鎖中內容
2).
l.acquire()
鎖中內容
l.release()
import time from multiprocessing import Process,Manager,Lock def f1(m_d,l2): with l2: # l2.acquire() tmp = m_d[`num`] tmp -= 1 time.sleep(0.1) m_d[`num`] = tmp # l2.release() if __name__ == `__main__`: m = Manager() l2 = Lock() m_d = m.dict({`num`:100}) p_list = [] for i in range(10): p = Process(target=f1,args=(m_d,l2)) p.start() p_list.append(p) [pp.join() for pp in p_list] print(m_d[`num`])
佇列
Queue()
Q = Queue(10)
Q.put() 放資料
Q.get() 取資料
Q.qsize() 返回的是當前佇列中內容的長度
Q.put_nowait() 不等待,但是報錯
Q.get_nowait() 不等待,也是報錯
Q.full() q.empty()
用佇列實現消費者生產者模型 : 緩衝用,解耦用的,
import time from multiprocessing import Process,Queue,JoinableQueue
#生產者 def producer(q): for i in range(10): time.sleep(0.2) s = `大包子%s號`%i print(s+`新鮮出爐`) q.put(s) q.join() #就等著task_done()訊號的數量,和我put進去的數量相同時,才繼續執行 print(`所有的任務都被處理了`) #消費者 def consumer(q): while 1: time.sleep(0.5) baozi = q.get() print(baozi+`被吃了`) q.task_done() #給佇列傳送一個取出的這個任務已經處理完畢的訊號 if __name__ == `__main__`: # q = Queue(30) q = JoinableQueue(30) #同樣是一個長度為30的佇列 pro_p = Process(target=producer,args=(q,)) con_p = Process(target=consumer,args=(q,)) pro_p.start() con_p.daemon = True con_p.start() pro_p.join() print(`主程式結束`)