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)