原文:https://www.cnblogs.com/LY-C/p/9145729.html
進程:資源分配的基本單位,進程數量為cpu核數+1,os.cpu_count()。計算密集時,使用進程
守護進程隨着主進程的最后一句代碼結束而結束
使用process模塊可以創建進程
from multiprocessing import Process p = Process(target,args,name) target:表示調用對象,即子進程要執行的任務 args:表示調用對象的位置參數”元組“ name:進程的名字
方法
p.start():啟動一個子進程,系統決定什么時候調用p.run() p.run():立即運行子進程 p.terminate():強制終止進程p,不會進行任何清理操作,如果p創建了子進程,該子進程就成了僵屍進程,使用該方法需要特別小心這種情況。如果p還保存了一個鎖那么也將不會被釋放,進而導致死鎖 p.is_alive():判斷p進程是否還存在,如果p仍然運行,返回True p.join([timeout]):異步變同步,讓主進程等待子進程執行完畢(強調:是主線程處於等的狀態,而p是處於運行的狀態)。timeout是可選的超時時間,需要強調的是,p.join只能join住start開啟的進程,而不能join住run開啟的進程
多進程啟動
#如果好多進程都要啟動,代碼太長可以寫成這樣 p_list = [p1,p2,p3,p4,p5] [i.start() for i in p_list]
屬性
p.daemon:默認值為False,如果設為True,代表p為后台運行的守護進程,當p的父進程終止時,p也隨之終止,並且設定為True后,p不能創建自己的新進程,必須在p.start()之前設置 p.name:進程的名稱 p.pid:進程的pid
示例
from multiprocessing import Process import time def func(name): print('son 的名字是 %s '%name) time.sleep(5) print('這里是son') if __name__ == '__main__': p = Process(target = func,args=('xxx',)) p.start() time.sleep(2) p.join()# 代碼執行到這里,主進程main會停止等待子進程執行完畢才繼續 print('這里是father')
鎖機制
from multiprocessing import Lock l = Lock() #創建一個鎖 l.acquire() # 加鎖 l.release() # 釋放鎖
信號機制
from multiprocessing import Semaphore l = Semaphore(n) #創建鎖,n是指初始化一把鎖配幾把鑰匙,一個int型 l.acquire() #加鎖,可以加n把鎖 l.release() #釋放鎖 #信號量機制比鎖機制多了一個計數器,這個計數器是用來記錄當前剩余幾把鑰匙的。 #當計數器為0時,表示沒有鑰匙了,此時acquire()處於阻塞。 #對於計數器來說,每acquire一次,計數器內部就減1,release一次,計數器就加1
事件機制
from multiprocessing import Event e = Event() #創建事件 e.wait() #判斷is_set的bool值,如果bool為True,則非阻塞,bool值為False,則阻塞 e.set() #將is_set()設為True e.clear() # 將is_set()設為False e.is_set() # 標識 # 事件是通過is_set()的bool值,去標識e.wait() 的阻塞狀態 # 當is_set()的bool值為False時,e.wait()是阻塞狀態 # 當is_set()的bool值為True時,e.wait()是非阻塞狀態 # 當使用set()時,是把is_set的bool變為True # 當使用clear()時,是把is_set的bool變為False
隊列
#先進先出 from multiprocessing import Queue q = Queue([n]) #n為該隊列最多元素的個數,省略不限制 q.get( [ block [ ,timeout ] ] ) #返回q中的一個項目。如果q為空,此方法將阻塞,直到隊列中有項目可用為止。 #block用於控制阻塞行為,默認為True. 如果設置為False,將引發Queue.Empty異常#timeout是可選超時時間,用在阻塞模式中。如果在指定的時間間隔內沒有項目可用,將引發Queue.Empty異常。 q.get_nowait( ) #同q.get(False)方法。 q.put(item [, block [,timeout ] ] ) #將item放入隊列。如果隊列已滿,此方法將阻塞至有空間可用為止。 #block控制阻塞行為,默認為True。如果設置為False,將引發Queue.Empty異常#timeout指定在阻塞模式中等待可用空間的時間長短。超時后將引發Queue.Full異常。 q.qsize() #返回隊列中目前項目的正確數量。 q.empty() #如果調用此方法時 q為空,返回True。 q.full() #如果隊列已滿,返回為True.
進程間共享內存
from multiprocessing import Manager m = Manager() num = m.dict({鍵 : 值}) num = m.list([1,2,3])
進程池
from multiprocessing import Pool p = Pool(5) #創建進程池,限定進程個數 p.apply(func,args=(,)) #同步執行線程,阻塞 p.apply_async(func,args=(,),callback=func2) #異步執行線程,非阻塞 #func函數返回的值,傳給了callback后面接的函數,進一步執行 p.map(func,iter) #異步執行,iter為可迭代對象 p.close() #不在向進程池中添加任務,同步不需要使用 p.join() #等待進程池執行完任務,同步不需要使用