寫在前面:python中的多執行緒其實並不是真正的多執行緒,如果想要充分地使用多核cpu的資源,在python中大部分情況需要使用多程序。python提供了非常好用的多程序包multiprocessing,只需要定義乙個函式,python會完成其他所有事情。借助這個包,可以輕鬆完成從單程序到併發執行的轉換。
1.multiprocessing模組提供了乙個process類來代表乙個程序物件
import os
import time
import multiprocessing
def run_proc(name): # 子程序要執行的**
print'執行子程序 %s ,子程序號為(%s)...' %(name, os.getpid())
print"我的處理內容是:%s+%s=?" %(name,name)returnnameif __name__=='__main__':
start=time.time()
print'父程序號為 %s.' %os.getpid()
print('----------------------------------------')
job=for i in range(3):
p= multiprocessing.process(target=run_proc, args=(i,))#多程序
print'子程序%d開啟...'%i
p.start() #
print'子程序%d結束...' %i
#加join()可以讓主線程一直等待全部的子執行緒結束之後,主線程自身才結束,程式退出for t injob:
t.join()#join()方法可以等待子程序結束後再繼續往下執行,通常用於程序間的同步
end=time.time()
print end-start
執行結果如下:
父程序號為 4924.
子程序0開啟...
子程序0結束...
子程序1開啟...
子程序1結束...
子程序2開啟...
執行子程序 0 ,子程序號為(5516)...
我的處理內容是:0+0=?
執行子程序 1 ,子程序號為(5517)...
我的處理內容是:1+1=?
執行子程序 2 ,子程序號為(5523)...
我的處理內容是:2+2=?
子程序2結束...
0.0220789909363
如果想要返回多程序process處理得到的結果,只需要利用multiprocessing 中的manager類即可,稍改**:
import os
import timefrommultiprocessing import manager
def run_proc(name,return_list): # 子程序要執行的**
print'執行子程序 %s ,子程序號為(%s)...' %(name, os.getpid())
print"我的處理內容是:%s+%s=?" %(name,name)
print'父程序號為 %s.' %os.getpid()
print('----------------------------------------')
manager=manager()
return_list=manager.list()
#return_dict=manager.dict() 也可以使用字典dict
job=for i in range(3):
p= multiprocessing.process(target=run_proc, args=(i,return_list))#多程序
print'子程序%d開啟...'%i
p.start()
print'子程序%d結束...' %i
printfor t injob:
t.join()
print"所有子程序處理得到的結果都在return_list中,值為:",return_list
執行結果如下:
父程序號為 4924.
子程序0開啟...
子程序0結束...
子程序1開啟...
子程序1結束...
子程序2開啟...
執行子程序 0 ,子程序號為(5614)...
我的處理內容是:0+0=?
執行子程序 1 ,子程序號為(5616)...
我的處理內容是:1+1=?
執行子程序 2 ,子程序號為(5623)...
我的處理內容是:2+2=?
子程序2結束...
所有子程序處理得到的結果都在return_list中,值為: [0, 1, 2]
2.pool:如果要啟動大量的子程序,可以用程序池的方式批量建立子程序:
frommultiprocessing import pool
import os, time, random
def long_time_task(name):
print'執行任務 %s ,子程序號為(%s)...' %(name, os.getpid())
print"我就是子程序號為(%s)處理的內容" %(os.getpid())
start=time.time()
time.sleep(random.random()* 3)
end=time.time()
print'任務 %s 執行了 %0.2f 秒.' % (name, (end -start))returnnameif __name__=='__main__':
print'父程序號為 %s.' %os.getpid()
rst=
p= pool(4) #程序池中含有4個子程序for i in range(5): #4個子程序完成5個任務,所以有乙個任務是需要等某個程序空閒再處理
print'等待所有子程序結束...'p.close()
p.join()#等待所有子程序執行完畢。呼叫join()之前必須先呼叫close(),呼叫close()之後就不能繼續新增新的process了。
print'所有子程序結束...'
執行結果如下:
父程序號為 3378.
執行任務0 ,子程序號為(4621)...
執行任務2 ,子程序號為(4624)...
執行任務1 ,子程序號為(4622)...
我就是子程序號為(4621)處理的內容
我就是子程序號為(4622)處理的內容
執行任務3 ,子程序號為(4627)...
我就是子程序號為(4624)處理的內容
我就是子程序號為(4627)處理的內容
任務1 執行了 0.16秒.
執行任務4 ,子程序號為(4622)...
我就是子程序號為(4622)處理的內容
等待所有子程序結束...
任務2 執行了 0.98秒.
任務4 執行了 0.89秒.
任務3 執行了 2.25秒.
任務0 執行了 2.89秒.
所有子程序結束...
直接輸出rst不會得到想要的結果:
rst執行結果:
這是需要用到.get()方法:
rst = [i.get() for i inrst]
rst執行結果:
[0, 1, 2, 3, 4]
python多程序 python多程序
當有多個非相關任務需要處理時,並行能大大提高處理速度。這裡簡要介紹python的multiprocessing模組。簡單多程序編寫 當我們任務數量確定而且比較少的時候,可以手動為每個任務指定乙個程序來執行。import multiprocessing as mp def f a print a if...
python多程序 Python多程序實踐
建立程序方式如下 可以通過lock鎖機制實現共享鎖,但比較常用的方式還是以上這些方式,效率更高,更安全。使用方式 構造 類方法 使用方式 構造 更多型別支援一般使用manager,支援的型別包括list,dict,namespace,lock,rlock,semaphore,boundedsemap...
python多程序 Python多程序程式設計詳解
本文 在 python 3.6 環境下測試通過。多程序 multiprocessing 模組是在 python 2.6 版本中加入的,和多執行緒 threading 模組類似,都是用來做並行運算的。不過python既然有了threading,為什麼還要搞乙個multiprocessing呢?這是因為...