簡體   English   中英

通過Python多處理模塊管理流程

[英]Managing Processes from Python multiprocessing module

所以我以為我最終會發布; 管理Process工作者的正確方法是什么? 我嘗試使用Pool ,但是我注意到我無法獲得每個已完成過程的返回值。 我嘗試使用回調,但也無法按預期工作。 我應該只用active_children ()自己管理它們嗎?

我的泳池代碼:

from multiprocessing import *                                                                                      
import time
import random

SOME_LIST = []

def myfunc():
    a = random.randint(0,3)
    time.sleep(a)
    return a

def cb(retval):
    SOME_LIST.append(retval)

print("Starting...")

p = Pool(processes=8)
p.apply_async(myfunc, callback=cb)
p.close()
p.join()

print("Stopping...")
print(SOME_LIST)

我期望值列表; 但是我得到的只是工作者工作中要完成的最后一項:

$ python multi.py 
Starting...
Stopping...
[3]

注意:答案不應該使用threading模塊; 原因如下:

在CPython中,由於使用了全局解釋器鎖,因此只有一個線程可以一次執行Python代碼(即使某些面向性能的庫可能克服了此限制)。 如果希望您的應用程序更好地利用多核計算機的計算資源,建議您使用多處理。

您誤會了apply_async工作方式。 它不會在Pool中的每個進程中調用您傳遞給它的函數。 它只是在一個工作進程中一次調用函數。 因此,您所看到的結果是可以預期的。 您可以通過兩種方法來獲得所需的行為:

from multiprocessing import Pool                                                                                   
import time
import random

SOME_LIST = []

def myfunc():
    a = random.randint(0,3)
    time.sleep(a)
    return a

def cb(retval):
    SOME_LIST.append(retval)

print("Starting...")

p = Pool(processes=8)
for _ in range(p._processes):
    p.apply_async(myfunc, callback=cb)
p.close()
p.join()

print("Stopping...")
print(SOME_LIST)

要么

from multiprocessing import Pool                                                                                      
import time
import random


def myfunc():
    a = random.randint(0,3)
    time.sleep(a)
    return a

print("Starting...")

p = Pool(processes=8)
SOME_LIST = p.map(myfunc, range(p._processes))
p.close()
p.join()

print("Stopping...")
print(SOME_LIST)

請注意,您也可以撥打apply_asyncmap比在池中的進程數量更多 Pool的想法是,無論提交多少任務,它都確保num_processes進程在Pool的整個生命周期中都將運行。 因此,如果您創建一個Pool(8)並調用一次apply_async ,則您的八個工作apply_async一個將獲得任務,而其他七個工作apply_async將處於空閑狀態。 如果創建Pool(8)並調用80次apply_async ,則這80個任務將分配給您的8個工作程序,一次實際處理的任務不超過8個。

暫無
暫無

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

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