簡體   English   中英

使用“Pool”進行多處理在 M1 Macbook 上引發錯誤

[英]Multiprocessing with `Pool` throws error on M1 Macbook

在我的 Macbook Pro(Intel,2020)上,我可以成功使用multiprocessing.Pool ,例如:

from multiprocessing import Pool

p = Pool(8)
results = p.map(worker_function, list_of_inputs)
p.close()

但是,如果我在我的 Macbook Air(M1,2020)上運行相同的代碼,我會一次又一次地收到一個奇怪的錯誤(下面的片段):

RuntimeError:
        An attempt has been made to start a new process before the
        current process has finished its bootstrapping phase.

        This probably means that you are not using fork to start your
        child processes and you have forgotten to use the proper idiom
        in the main module:

            if __name__ == '__main__':
                freeze_support()
                ...

        The "freeze_support()" line can be omitted if the program
        is not going to be frozen to produce an executable.

為了解決這個問題,我首先閱讀了這篇博文 作者解釋了 Python 可以啟動新線程的不同方式,例如通過fork -ing(基本上復制現有解釋器及其大部分內存)、 spawn -ing 新解釋器等。

在官方文檔中,OSX 上的默認啟動方法似乎是fork 但是,我注意到,在我的 Macbook(M1,2020)上,如果我運行:

import multiprocessing

multiprocessing.get_start_method()

我得到"spawn"

所以我設法通過在創建池時明確聲明我想要"fork"啟動方法來解決問題

from multiprocessing import get_context

p = get_context("fork").Pool(8)
results = p.map(worker_function, list_of_inputs)
p.close()

暫無
暫無

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

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