python 多進程

來源:互聯網
上載者:User

標籤:共用資料   進程建立   dump   queue   range   將不   修改   通訊   進程同步   

multiprocessing 模組介紹

python中的多線程無法利用多核優勢,如果想要充分的使用多核cpu的資源,os.cpu_count可以查看邏輯cpu數,在python中大部分情況需要使用多進程,python提供了multiprocessing

muliprocessing模組用來開啟子進程,並在子進程中執行我們制定的任務(比如函數),這個模組與多

線程模組threading編程介面類似

multiprocessing模組的功能眾多,支援子進程,通訊和共用資料,執行不同形式的同步,提供了Process,Queue,Pipe,Lock等組件

multiprocessing與線程不同的是進程沒有任何共用狀態,進程修改資料僅限於該進程內

Process類

Process(group,target=func,name=str,args(x,),kwargs={‘num‘:1,})

由該類執行個體化得到的對象,表示一個子進程中的任務

強調:需要使用關鍵字的方式來給Process傳參數

  args指定的為target對應的函數傳位置參數,是元組形式,括弧類必須有逗號

參數介紹:

 

1 group參數未使用,值始終為None2 3 target表示調用對象,即子進程要執行的任務4 5 args表示調用對象的位置參數元組,args=(1,2,‘egon‘,)6 7 kwargs表示調用對象的字典,kwargs={‘name‘:‘egon‘,‘age‘:18}8 9 name為子進程的名稱


方法介紹:

1.P.start()啟動進程,並調用該子進程中的P.run()
2.P.run()進程啟動時啟動並執行方法,他去調用target指定的函數,我們在自訂/繼承與Process的類總一定要實現run()這個方法
3.P.terminate()強制終止進程p,不會進行任何清理操作,如果p建立了子進程,那麼這個子進程就成了殭屍進程
  使用該方法需要特別小心這種情況,如果p還儲存了一個鎖那麼也將不會被釋放,進而導致死結
4.P.is_alive()如果p任然在運行,那麼返回True
5.P.join([timeout])主線程式等待p終止(強調,是主線程式處於等待狀態,p處於運行狀態),timeout是可選的
  逾時時間,P.join()只能join住start開啟的進程,放在start()下邊,而不能join住run開啟的進程

屬性介紹:

p.deamon,預設值為False,如果設為True,代表p為後台啟動並執行守護進程,當p父進程終止時,p也隨之終止,並且
設定為True後,p不能建立自己的新進程,p.deamon必須在p.start()之前設定

p.name進程的名稱

p.pid進程的id


process類的使用

在windo中process()必須放到if__name__==‘__main__‘:下去運行,不會在匯入時被調用

由於window沒有fork,多處理模組啟動一個新的python進程並匯入調用模組
如果在匯入時調用process(),name這將啟動無限繼承的新進程(或直到機器耗盡資源)

建立並開啟子進程的兩種方式

#開進程的方法一:
import time
import random
from multiprocessing import Process
def piao(name):
print(‘%s piaoing‘ %name)
time.sleep(random.randrange(1,5))
print(‘%s piao end‘ %name)

 

p1=Process(target=piao,args=(‘egon‘,)) #必須加,號
p2=Process(target=piao,args=(‘alex‘,))
p3=Process(target=piao,args=(‘wupeqi‘,))
p4=Process(target=piao,args=(‘yuanhao‘,))

p1.start()
p2.start()
p3.start()
p4.start()
print(‘主線程‘)

方法一


#開進程的方法二:
import time
import random
from multiprocessing import Process


class Piao(Process):
def __init__(self,name):
super().__init__()
self.name=name
def run(self):
print(‘%s piaoing‘ %self.name)

time.sleep(random.randrange(1,5))
print(‘%s piao end‘ %self.name)

p1=Piao(‘egon‘)
p2=Piao(‘alex‘)
p3=Piao(‘wupeiqi‘)
p4=Piao(‘yuanhao‘)

p1.start() #start會自動調用run
p2.start()
p3.start()
p4.start()
print(‘主線程‘)

方法二

 

進程直接的記憶體空間是隔離的

 

 

守護進程

主進程建立守護進程

  其一:守護進程會在主進程代碼執行結束後就終止

  其二:守護進程內無法再開啟子進程,否則拋出異常:AssertionError: daemonic processes are not allowed to have children

注意:進程之間是互相獨立的,主進程代碼運行結束,守護進程隨即終止

from multiprocessing import Process
import time
import random

class Piao(Process):
def __init__(self,name):
self.name=name
super().__init__()
def run(self):
print(‘%s is piaoing‘ %self.name)
time.sleep(random.randrange(1,3))
print(‘%s is piao end‘ %self.name)


p=Piao(‘egon‘)
p.daemon=True #一定要在p.start()前設定,設定p為守護進程,禁止p建立子進程,並且父進程代碼執行結束,p即終止運行
p.start()
print(‘主‘)

 

 

 

進程同步(鎖)

進程之間資料不共用,但是共用同一套檔案系統,所以訪問同一個檔案,或同一個列印終端,是沒有問題的,

而共用帶來的是競爭,競爭帶來的結果就是錯亂,如何控制,就是加鎖處理

 

#檔案db的內容為:{"count":1}
#注意一定要用雙引號,不然json無法識別
from multiprocessing import Process,Lock
import time,json,random
def search():
dic=json.load(open(‘db.txt‘))
print(‘\033[43m剩餘票數%s\033[0m‘ %dic[‘count‘])

def get():
dic=json.load(open(‘db.txt‘))
time.sleep(0.1) #類比讀資料的網路延遲
if dic[‘count‘] >0:
dic[‘count‘]-=1
time.sleep(0.2) #類比寫資料的網路延遲
json.dump(dic,open(‘db.txt‘,‘w‘))
print(‘\033[43m購票成功\033[0m‘)

def task(lock):
search()
lock.acquire()
get()
lock.release()
if __name__ == ‘__main__‘:
lock=Lock()
for i in range(100): #類比並發100個用戶端搶票
p=Process(target=task,args=(lock,))
p.start()

加鎖:購票行為由並發變成了串列,犧牲了運行效率,但保證了資料安全

 

#加鎖可以保證多個進程修改同一塊資料時,同一時間只能有一個任務可以進行修改,即串列的修改,沒錯,速度是慢了,但犧牲了速度卻保證了資料安全。雖然可以用檔案分享權限設定資料實現處理序間通訊,但問題是:1.效率低(共用資料基於檔案,而檔案是硬碟上的資料)2.需要自己加鎖處理

 

python 多進程

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.