簡體   English   中英

你可以在 Python 中使用多處理進行嵌套並行化嗎?

[英]Can you do nested parallelization using multiprocessing in Python?

我是 Python 中多處理的新手,我正在嘗試執行以下操作:

import os
from multiprocessing import Pool
from random import randint

def example_function(a):

    new_numbers = [randint(1, a) for i in range(0, 50)]

    with Pool(processes=os.cpu_count()-1) as pool:
        results = pool.map(str, new_numbers)

    return results


if __name__ == '__main__':

    numbers = [randint(1, 50) for i in range(0, 50)]

    with Pool(processes=os.cpu_count()) as pool:
        results = pool.map(example_function, numbers)

    print("Final results:", results)

但是,當運行它時,我得到:“AssertionError: daemonic processes are not allowed to have children”。

pool.map為 for 循環確實可以使其工作。 例如第二個:

results = []
for n in numbers:
    results.append(example_function(n))

但是,由於外部和內部任務都非常密集,我希望能夠並行化兩者。 我怎樣才能做到這一點?

multiprocessing.Pool創建進程,並將daemon標志設置為True 根據Process類的 Python 文檔,這可以防止在工作進程中創建子進程:

進程的守護進程標志,一個布爾值。 這必須在調用 start() 之前設置。
初始值是從創建過程中繼承的。 當一個進程退出時,它會嘗試終止它的所有守護進程
請注意,不允許守護進程創建子進程 否則,如果一個守護進程在其父進程退出時被終止,它的子進程就會成為孤兒 此外,這些不是 Unix 守護進程或服務,它們是正常進程,如果非守護進程退出,它們將被終止(而不是加入)。

理論上,您可以創建自己的池並使用繞過​​進程創建的自定義上下文來創建非守護進程。 但是,您不應該這樣做,因為如文檔中所述,終止進程是不安全的。

事實上,在池中創建池在實踐中並不是一個好主意,因為池中的每個進程都會創建另一個進程池。 這導致創建了許多效率非常低的進程。 在某些情況下,進程的數量對於操作系統來說太大而無法創建它們(存在依賴於平台的限制)。 例如,在多核處理器上,如最近的 64 核 AMD threadripper 處理器,具有 128 個線程,進程總數將為128 * 128 = 16384 ,這顯然是不合理的。

解決此問題的通常解決方案是推理任務而不是流程。 任務可以添加到共享隊列中,因此工作人員可以計算任務,然后工作人員可以通過在共享隊列中添加新任務來生成新任務。 AFAIK,多處理管理器對於設計這樣的系統很有用。

暫無
暫無

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

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