在 M1 Macbook 上使用“Pool”进行多重处理会引发错误

Ulf*_*lak 6 python multiprocessing python-multiprocessing apple-m1

在我的 Macbook Pro(英特尔,2020)上,我可以成功使用multiprocessing.Pool

from multiprocessing import Pool

p = Pool(8)
results = p.map(worker_function, list_of_inputs)
p.close()
Run Code Online (Sandbox Code Playgroud)

但是,如果我在 Macbook Air(M1,2020)上运行相同的代码,我会一次又一次地重复出现奇怪的错误(片段如下):

from multiprocessing import Pool

p = Pool(8)
results = p.map(worker_function, list_of_inputs)
p.close()
Run Code Online (Sandbox Code Playgroud)

Ulf*_*lak 12

为了解决这个问题,我首先阅读了这篇博文。作者解释了 Python 启动新线程的不同方式,例如通过fork -ing(基本上复制现有解释器及其大部分内存)、spawn -ing 新解释器等。

在官方文档中,OSX上的默认启动方式似乎是fork。然而,我注意到,在我的 Macbook(M1,2020)上,如果我运行:

import multiprocessing

multiprocessing.get_start_method()
Run Code Online (Sandbox Code Playgroud)

我明白了"spawn"

因此,我通过在创建池时明确声明我想要start 方法来解决这个问题。"fork"

from multiprocessing import get_context

p = get_context("fork").Pool(8)
results = p.map(worker_function, list_of_inputs)
p.close()
Run Code Online (Sandbox Code Playgroud)

更新

你退房了吗ray?它速度更快,并且具有更清晰的多处理 API。上面的内容很简单:

import ray
results = ray.get([worker_funtion.remote(inp) for inp in list_of_inputs])
Run Code Online (Sandbox Code Playgroud)