初識 Process 多進程模塊,可以使啓動一個主進程的時候會自動建立一個或多個子進程,進程裏的第一個進程就是主進程json
程序執行的實例,每個進程都有惟一的pid,每一個子進程的數據都是互相隔離的。方法:app
同步:只能等待一個事情作完了才能作另外一個事情,好比先作完A才能作B。異步
異步:並行作多個事情,好比一邊作A的事情,同時也在作B的事情。函數
一、沒約束時,不會待進程執行完再執行下面的代碼:學習
from multiprocessing import Process def func(arg1,arg2): print('arg1:',arg1) print('arg2:',arg2) if __name__ == '__main__': p=Process(target=func,args=(5,8)) p.start() print('》》》最後一行代碼的打印') # 沒約束時,不會待進程執行完再執行下面的代碼
二、join():感知子進程的結束,將異步變爲同步。ui
# 二、join():感知子進程的結束,將異步變爲同步 from multiprocessing import Process def func(arg1,arg2): print('arg1:',arg1) print('arg2:',arg2) if __name__ == '__main__': p=Process(target=func,args=(5,8)) p.start() p.join() # 感知子進程的結束,將異步變爲同步 print('》》》最後一行代碼的打印')
三、多個子進程執行,列表推導式:必須執行完多個子進程後,再執行下面的代碼。spa
from multiprocessing import Process import time def func(arg1,arg2): print('arg1:',arg1) time.sleep(0.1) print('arg2:',arg2) if __name__ == '__main__': p_list=[] for i in range(5): # 異步多個子進程執行 p = Process(target=func, args=(1*i, 10)) p_list.append(p) p.start() [p.join() for p in p_list] # 必須執行完多個子進程後,再執行下面的代碼。 print('哈哈哈!')
一、自定義類,繼承Process。3d
注意:傳參數需用繼承的方法解決,super().__init__()code
# 四、另外一種多進程,自定義類繼承Process from multiprocessing import Process import time class My_func(Process): def __init__(self,num): super().__init__() # 傳參數需用繼承的方法解決 self.num=num def run(self): '''下面多進程要運行的代碼''' print(self.num) time.sleep(0.1) print(self.num*self.num) if __name__ == '__main__': p1=My_func(1) p1.start() p2=My_func(2) p2.start()
一、守護進程隨着主進程的代碼執行完畢而結束:p.daemon=True blog
from multiprocessing import Process import time def func(): while 1: time.sleep(1) print('func1') if __name__ == '__main__': p=Process(target=func) p.daemon=True # 設置爲守護進程 p.start() print(1) print(p.is_alive()) # 查看進度是否存在,返回bool time.sleep(2) # p.terminate() # 結束一個進程 print(p.is_alive()) time.sleep(2) print('守護進程隨着全部主進程執行後而結束!!') print(p.is_alive())
二、進程鎖,好比搶票會有多個用戶一塊兒搶。
①沒有鎖進程的狀況下:發現餘票只有一張,但每一個進程都能搶到票了,實際也就只有一張改怎麼辦?
②進程鎖:Lock
這樣就能夠解決相似這樣的問題。
from multiprocessing import Process,Lock import time,json def find(): with open(r'test.py')as f: d = json.load(f) print('剩餘免費門票:%s'%d['count']) def buy(i,lock): lock.acquire() # 拿鑰匙 with open(r'test.py')as f: d = json.load(f) if d['count']<=0:print('門票已被搶完~') else: print('恭喜用戶 %s 成功搶到門票了'%i) if d['count']!=0:d['count']-=1 time.sleep(0.2) with open(r'test.py','w')as f: json.dump(d,f) lock.release() # 還鑰匙 if __name__ == '__main__': for i in range(1): # 5個進程同時查詢 p=Process(target=find) p.start() lock=Lock() for i in range(5): p1=Process(target=buy,args=(i,lock)) p1.start()
歡迎來你們QQ交流羣一塊兒學習:482713805