Python多進程怎么應用_第1頁
Python多進程怎么應用_第2頁
Python多進程怎么應用_第3頁
Python多進程怎么應用_第4頁
Python多進程怎么應用_第5頁
全文預覽已結束

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第Python多進程怎么應用一旦我們創(chuàng)建了Process類的實例,我們只需要啟動該進程。這是通過編寫p.start()完成的。此時,該進程開始。

在我們退出之前,我們需要等待子進程完成它的計算。該join()方法等待進程終止。

在這個例子中,我們只創(chuàng)建了一個子進程。正如你可能猜到的,我們可以通過在Process類中創(chuàng)建更多實例來創(chuàng)建更多子進程。

如果我們需要創(chuàng)建多個進程來處理更多CPU密集型任務怎么辦?我們是否總是需要明確地開始并等待終止?這里的解決方案是使用Pool類。

Pool類允許你創(chuàng)建一個工作進程池,在下面的示例中,我們將研究如何使用它。這是我們的新示例:

frommultiprocessingimportPool

importtime

importmath

N=5000000

defcube(x):

returnmath.sqrt(x)

if__name__==__main__:

withPool()aspool:

result=pool.map(cube,range(10,N))

print(Programfinished!)

在這個代碼片段中,我們有一個cube(x)函數,它只接受一個整數并返回它的平方根。很簡單,對吧?

然后,我們創(chuàng)建一個Pool類的實例,而不指定任何屬性。默認情況下,Pool類為每個CPU核心創(chuàng)建一個進程。接下來,我們使用幾個參數運行map方法。

map方法將cube函數應用于我們提供的可迭代對象的每個元素在本例中,它是從10到N的每個數字的列表。

這樣做的最大優(yōu)點是列表上的計算是并行進行的!

joblib

包joblib是一組使并行計算更容易的工具。它是一個用于多進程的通用第三方庫。它還提供緩存和序列化功能。要安裝joblib包,請在終端中使用以下命令:

pipinstalljoblib

我們可以將之前的示例轉換為以下示例以供使用joblib:

fromjoblibimportParallel,delayed

defcube(x):

returnx**3

start_time=time.perf_counter()

result=Parallel(n_jobs=3)(delayed(cube)(i)foriinrange(1,1000))

finish_time=time.perf_counter()

print(fProgramfinishedin{finish_time-start_time}seconds)

print(result)

事實上,直觀地看到它的作用。delayed()函數是另一個函數的包裝器,用于生成函數調用的延遲版本。這意味著它在被調用時不會立即執(zhí)行函數。

然后,我們多次調用delayed函數,并傳遞不同的參數集。例如,當我們將整數1賦予cube函數的延遲版本時,我們不計算結果,而是分別為函數對象、位置參數和關鍵字參數生成元組(cube,(1,),{})。

我們使用Parallel()創(chuàng)建了引擎實例。當它像一個以元組列表作為參數的函數一樣被調用時,它將實際并行執(zhí)行每個元組指定的作業(yè),并在所有作業(yè)完成后收集結果作為列表。在這里,我們創(chuàng)建了n_jobs=3的Parallel()實例,因此將有三個進程并行運行。

我們也可以直接編寫元組。因此,上面的代碼可以重寫為:

result=Parallel(n_jobs=3)((cube,(i,),{})foriinrange(1,1000))

使用joblib的好處是,我們可以通過簡單地添加一個附加參數在多線程中運行代碼:

result=Parallel(n_jobs=3,prefer=threads)(delayed(cube)(i)foriinrange(1,1000))

這隱藏了并行運行函數的所有細節(jié)。我們只是使用與普通列表理解沒有太大區(qū)別的語法。

充分利用Python多進程

創(chuàng)建多個進程并進行并行計算不一定比串行計算更有效。對于CPU密集度較低的任務,串行計算比并行計算快。因此,了解何時應該使用多進程非常重要這取決于你正在執(zhí)行的任務。

為了讓你相信這一點,讓我們看一個簡單的例子:

frommultiprocessingimportPool

importtime

importmath

N=5000000

defcube(x):

returnmath.sqrt(x)

if__name__==__main__:

#firstway,usingmultiprocessing

start_time=time.perf_counter()

withPool()aspool:

result=pool.map(cube,range(10,N))

finish_time=time.perf_counter()

print(Programfinishedin{}seconds-usingmultiprocessing.format(finish_time-start_time))

print(---)

#secondway,serialcomputation

start_time=time.perf_counter()

result=[]

forxinrange(10,N):

result.append(cube(x))

finish_time=time.perf_counter()

print(Programfinishedin{}seconds.format(finish_time-start_time))

此代碼段基于前面的示例。我們正在解決同樣的問題,即計算N個數的平方根,但有兩種方法。第一個涉及Python進程的使用,而第二個不涉及。我們使用time庫中的perf_counter()方法來測量時間性能。

在我的電腦上,我得到了這個結果:

pythoncode.py

Programfinishedin1.6385094seconds-usingmultiprocessing

Programfinishedin2.7373942999999996seconds

如你所見,相差不止一秒。所以在這種情況下,多進程更好。

讓我們更改代碼中的某些內容,例如N的值。讓我們把它降低到N=10000,看看會發(fā)生什么。

這就是我現在得到的:

pythoncode.py

Programfinishedin0.3756742secon

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論