首先和線程進行比較
導入進程標準模塊和線程標準模塊
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()