python process


原文: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()   #等待進程池執行完任務,同步不需要使用

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM