簡體   English   中英

如何“輪詢”python 多進程池 apply_async

[英]how to "poll" python multiprocess pool apply_async

我有一個這樣的任務 function:

def task (s) :
    # doing some thing
    return res

原程序是:

res = []
for i in data :
    res.append(task(i))
    # using pickle to save res every 30s

我需要處理大量數據,我不關心結果的 output 順序。 由於運行時間較長,需要定時保存當前進度。 現在我將其更改為多處理

pool = Pool(4)
status = []
res = []
for i in data :
    status.append(pool.apply_async(task, (i,))

for i in status :
    res.append(i.get())
    # using pickle to save res every 30s

假設我在池中有進程 p0、p1、p2、p3 和 10 個任務,(task(0).... task(9))。 如果 p0 需要很長時間才能完成任務 (0)。

  1. 主進程是否在第一個“res.append(i.get())”處被阻塞?
  2. 如果p1完成task(1),p0還在處理task(0),p1會繼續處理task(4)還是更晚?
  3. 如果第一個問題的答案是肯定的,那么如何提前得到其他的結果。 最后得到task(0)的結果
  1. 是的

  2. 是的,因為流程是異步提交的。 如果輸入可迭代的大小大於最大進程/工作者數, p1 (或其他)也會獲取另一塊數據

  3. “……如何提前得到其他結果”
    一種方便的選擇是依賴concurrent.futures.as_completed ,它將在完成時返回結果:


import time
import concurrent.futures


def func(x):
    time.sleep(3)
    return x ** 2


if __name__ == '__main__':
    data = range(1, 5)
    results = []

    with concurrent.futures.ProcessPoolExecutor(4) as ex:
        futures = [ex.submit(func, i) for i in data]
        # processing the earlier results: as they are completed
        for fut in concurrent.futures.as_completed(futures):
            res = fut.result()
            results.append(res)
            print(res)

樣本 output:

4
1
9
16

另一種選擇是在apply_async(func[, args[, kwds[, callback[, error_callback]]]])調用上使用callback 回調僅接受單個參數作為 function 的返回結果。在該回調中,您可以以最少的方式處理結果(考慮到它僅綁定到一個具體函數的單個參數/結果)。 總體方案如下所示:

def res_callback(v):
    # ... processing result
    with open('test.txt', 'a') as f:  # just an example
        f.write(str(v))
    print(v, flush=True)


if __name__ == '__main__':
    data = range(1, 5)
    results = []
    with Pool(4) as pool:
        tasks = [pool.apply_async(func, (i,), callback=res_callback) for i in data]
        # await for tasks finished

但是該模式仍然需要以某種方式等待get()結果)提交的任務。

暫無
暫無

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

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