1. 程式人生 > >python並發編程之多進程(實現)

python並發編程之多進程(實現)

打印 spa art gpo 多核 也會 如果 屬性 設置

一、multipricessing模塊的介紹

 python中的多線程無法利用多核優勢,如果想要充分的使用多核CPU資源,在python中大部分情況下需要用多線程,python提供了multiprocessing模塊

 multiprocessing模塊用來開啟子進程,並在子進程中執行我們的任務(比如函數),該模塊與多線程模塊threading類的編程接口類似。

  multiprocessing模塊的功能眾多:支持子進程、通信和共享數據,執行不同形式的同步,提供了Process類,Queue類,Pipe類,Lock類等組件

二、Process模塊的介紹

基本格式:

1 from
multiprocessing import Process #導入模塊 2 3 def func(x): #定義一個函數(等待開一個新線程執行的函數) 4 print(x) 5 6 if __name__ == __main__: #windows下一定要加上這句話才能運行 7 p = Process(target=func,args=(傳參,)) #實例化一個進程,將函數名作為參數傳遞,將需要傳給函數的參數(元組形式)傳遞 8 p.start() #
(通知操作系統)開啟此進程

通過類的方式調用:

from multiprocessing import Process     #調用模塊

class MyProcess(Process):               #定義一個類,必須要繼承Process類
    def __init__(self,name):            #如果需要參數,一定要有init方法
        super().__init__()              #如果有init方法,一定要調用父類的init方法
        self.name = name

    def run(self):                      #
一定要實現一個run方法來重寫父類的run print(子進程%s已開啟%self.name) if __name__ == __main__: p = MyProcess(aaa) #實例化一個自定義類的對象 p.start() #開啟進行

參數介紹:

target表示調用對象,既子進程要執行的任務
args表示調用對象的位置參數元組,如:args=(1,)或者args=(1,2)
kwargs表示調用對象的字典,如:kwargs={name:fuyong}

方法介紹:

p.start()    啟動進程,並且調用該子進程的run()方法
p.run()      進程啟動時運行的方法,正式它去調用target指定的函數,我們自定義類的話一定要實現該方法
P.terminate()強制終止程序p,不會進行任何清理操作,如果p創建了子進程,那麽該子進程就成了‘僵屍進程
             使用此方法時要特別小心,如果p還保留了一個鎖,那麽鎖也不會被釋放,進而導致了死鎖
p.is_alive() 判斷p是否還在運行,在運行返回True
p.join()     如果加上此方法,那麽主線程將等著此線程運行完畢之後才會運行

屬性介紹:

p.daemon 默認值為False,如果設置為True,則代表後臺運行的守護進程,當p的父進程終止時,p也會隨之終止

p.name 進程名

p.pid 進程的pid

三、守護進程

主進程創建守護進程

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

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

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



設置守護進程的方法:

p.daemon = True
p.daemon 默認值為False,如果設置為True,則代表後臺運行的守護進程,當p的父進程終止時,p也會隨之終止

五、進程同步(鎖)

進程之間數據不共享,但是共享同一套文件系統,所以訪問同一個文件,或同一個打印終端,是沒有問題的,

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

加鎖方式:

1、導入Lock類

2、實例化一個鎖 lock = Lock()

3、將lock作為參數傳給子進程函數

4、函數在需要枷鎖的代碼前加上lock.acquire()方法,在需要釋放鎖的地方加上lock.release()方法

六、隊列

進程彼此之間互相隔離,要實現進程間通信(IPC),multiprocessing模塊支持兩種形式:隊列和管道,這兩種方式都是使用消息傳遞的

from multiprocessing import Queue

q = Queue(3)  #限制最多放3個  如果超過3個則會堵塞,需要等待拿出去1個之後才能繼續放

q.put(1)      #放數據(可以放任何數據類型)
q.put(2)      #放數據(可以放任何數據類型)
q.put(3)      #放數據(可以放任何數據類型)

print(q.get()) #拿數據
print(q.get()) #拿數據
print(q.get()) #拿數據

python並發編程之多進程(實現)