python 多進程(mutiprocessing)以及進程間的通信

首先和線程進行比較

 

導入進程標準模塊和線程標準模塊

import multiprocessing as mp
import threading as td

定義一個被進程和線程調用的函數

def job(a,d):
    print('aaaaa')

創建進程和線程

p1 = mp.Process(target=job,args=(1,2))
t1 = td.Thread(target=job,args=(1,2))

注意:Thread和Process的首字母都要大寫,被調用的函數沒有括號,被調用的函數的參數放在args(…)中

分別啓動進程和線程

p1.start()
t1.start()

分別連接進程和線程

p1.join()
t1.join()

完整的線程和進程創建對比代碼

import multiprocessing as mp
import threading as td

def job(a,d):
    print('aaaaa')

t1 = td.Thread(target=job,args=(1,2))
p1 = mp.Process(target=job,args=(1,2))
t1.start()
p1.start()
t1.join()
p1.join()

從上面的使用對比代碼可以看出,線程和進程的使用方法相似

進程的運用

在運用時需要添加上一個定義main函數的語句

import multiprocessing as mp

def job(a,d):
    print('aaaaa')

if __name__=='__main__':
    p1 = mp.Process(target=job,args=(1,2))
    p1.start()
    p1.join()

運行後打印的結果爲:

aaaaa

進程間的通信

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

----這是操作系統開闢的一個空間,可以讓各個子進程把信息放到Queue中,也可以把自己需要的信息取走
----這就相當於系統給python開闢了一個聊天室,讓python創建的子進程可以在這個聊天室裏暢所欲言
----一個進程可以放多條消息到Queue中

Queue的功能是將每個核或線程的運算結果放在隊裏中, 等到每個線程或核運行完畢後再從隊列中取出結果, 繼續加載運算。原因很簡單, 多線程調用的函數不能有返回值, 所以使用Queue存儲多個線程運算的結果

多進程就是多核運算

創建一個多進程並且互相之間進行通信的實例如下:

import multiprocessing as mp

def job(q):
    res=0
    for i in range(1000):
        res+=i+i**2+i**3
    q.put(res)    #queue

if __name__=='__main__':
    q = mp.Queue()
    p1 = mp.Process(target=job,args=(q,))
    p2 = mp.Process(target=job,args=(q,))
    p1.start()
    p2.start()
    p1.join()
    p2.join()
    res1 = q.get()
    res2 = q.get()
    print(res1+res2)

在你自己的任務中,只需要修改job函數的內容即可

注意:

當創建了多個process子進程時,創建完成後先start(),最後必須統一join,這樣所有子進程纔會並行執行。

q = mp.Queue()
for i in range(worknum):
    p = Process(target = job, args = (q,))
    p.start()
    proc_record.append(p)
  for p in proc_record:
    p.join()

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章