在 Python 中執行並行處理
Najwa Riyaz
2023年1月30日
2021年7月10日
本文介紹瞭如何在 Python 中並行執行多個程序。
在 Python 中使用處理池及其方法執行多處理
要在 Python 中執行多處理,請執行以下步驟。
- 首先,匯入
multiprocessing
模組。 - 使用
Pool
類來定義 Python 處理池。這個池代表一個工作程序池。以下面的程式碼片段為例。
Pool(processes=n)
因此,Pool
類將允許同時執行 n
個程序。此類包含啟用將任務委派給池的工作程序的方法。
以下是 Pool
類的一些方法。
-
Pool.map()
- 使用池的這個阻塞方法阻塞直到結果準備好。此方法將關聯的一個可迭代物件分成幾個塊。然後,它將塊作為單獨的任務提交給程序池。 -
使用以下
Pool
類的非阻塞方法同時提交程序。使用get()
方法獲取函式的結果。 -
Pool.apply_async()
-
Pool.map_async()
要確定你的機器可以為多處理處理的程序數,你應該知道你裝置中的處理器數;你可以使用以下程式碼進行檢查。
import multiprocessing as mp
print("Number of processors: ", mp.cpu_count())
輸出:
Number of processors: 4
在 Python 中使用 apply_async()
函式執行多處理
這是一個示例,演示了使用 Python 中的處理池進行多處理,同時確定 0-9 數字範圍的平方。
注意這裡,我們甚至列印了 Process worker 的名字,這是可選的。
from multiprocessing import Pool
from multiprocessing import Process, current_process
import time
from time import sleep
import random
def fnc_square(x):
print(current_process().name)
return x*x
if __name__ == '__main__':
pool = Pool(processes=4)
result = pool.apply_async(fnc_square, [6])
print( result.get(timeout=1) )
print (pool.map(fnc_square, range(10)))
輸出:
SpawnPoolWorker-1
36
SpawnPoolWorker-2
SpawnPoolWorker-1
SpawnPoolWorker-2
SpawnPoolWorker-1
SpawnPoolWorker-2
SpawnPoolWorker-1
SpawnPoolWorker-2
SpawnPoolWorker-1
SpawnPoolWorker-2
SpawnPoolWorker-1
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
在 Python 中使用 map()
和 map_sync()
函式執行多處理
map_async
函式是非阻塞的,而 map
函式是阻塞的。下面的示例演示了這兩個命令之間的區別。
from multiprocessing import Pool
import time
def f(x):
print (x*x)
if __name__ == '__main__':
pool = Pool(processes=1)
pool.map(f, range(10))
r = pool.map_async(f, range(10))
print ('First print')
print ('Second print')
r.wait()
print ('Third print')
在這裡,我們可以觀察到 pool.map()
函式將等待 10 次操作呼叫完成。因此,我們看到按順序列印的結果。
此外,pool.map_async()
將非同步執行 10 個函式呼叫。當 r.wait()
函式被呼叫時,它會阻止處理器執行。因此,在輸出中,我們看到列印訊息為 First print
和 Second print
,但 Third print
總是在最後。
輸出:
0
1
4
9
16
25
36
49
64
81
First print
Second print
0
1
4
9
16
25
36
49
64
81
Third print