簡體   English   中英

Python多重處理-將新功能分配給完成的過程嗎?

[英]Python multiprocessing - Allocate a new function to a finished process?

我有800個要並行處理的圖像文件的列表。 假設我將其名稱存儲在這樣的列表中:

lis_fnames = ['im1.jpg','im2.jpg',...']

然后,我導入多處理模塊,並從中導入Pool。 我給每個線程一個名為'run_cli'的函數,該函數接受文件名。

到目前為止,我運行以下代碼:

def run_pool():
    pool = Pool(processes=4)
    pool.map(run_cli, ['im1.jpg','im2.jpg','im3.jpg','im4.jpg'])

並在迭代完成后手動更改文件名。 我的問題是:

問:給定四個進程,如果一個進程已完成,如何自動為它提供'run_cli'函數和另一個文件名(來自lis_fnames列表)以供分析,而不必等待所有四個進程完成,然后手動再次運行它?

您應該將其留給游泳池。 無需將可迭代對象手動拆分為合適的塊。 只需映射所有內容,只要列表中還有剩余項目,Pool就會繼續為您的工人提供更多工作。

這是一個簡單但可行的示例。 它還顯示了兩種可能的結果處理方式。 它執行回調並解析結果對象。 當然,您將只執行其中之一-如果您不關心工人的返回值,則不執行任何操作。

import multiprocessing    
from time import sleep
import random

def completed(x):
    print("Done {}".format(x))

def worker(x):
    sleep(x)
    print("Worker completed {}".format(x))
    return(x)

p = multiprocessing.Pool(processes=4)

tasks = [random.randint(0,5) for _ in range(0,20)]

results = p.map_async(worker, tasks, callback=completed)

p.close()
p.join()
for r in results.get():
    print(r)

這將生成一個“任務”列表,在這種情況下,只是一個隨機數列表。 Worker通過休眠作為參數發送的秒數來模擬工作。 您可以看到工作人員完成了,最后,當所有工作人員都完成后,您將獲得“結果”。

總是有四個並行的工作人員處於活動狀態,但是任務列表不止於此。 游泳池能夠照顧到這一點。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM