在 Python 中執行並行處理

Najwa Riyaz 2023年1月30日 2021年7月10日
  1. 在 Python 中使用處理池及其方法執行多處理
  2. 在 Python 中使用 apply_async() 函式執行多處理
  3. 在 Python 中使用 map()map_sync() 函式執行多處理
在 Python 中執行並行處理

本文介紹瞭如何在 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 printSecond 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

相關文章 - Python Process