使用 M1 Mac 进行 Python 多处理

Po-*_*ang 7 python macos multiprocessing apple-m1

我有一台 Mac(Mac Os 11.1,Python Ver 3.8.2),需要在多处理中工作,但程序不起作用\xe2\x80\x99。

\n
import multiprocessing\n\n\ndef func(index: int):\n    print(index)\n\n\nmanager = multiprocessing.Manager()\nprocesses = []\n\nfor i in range(-1, 10):\n    p = multiprocessing.Process(target=func,\n                                args=(i,))\n    processes.append(p)\n    p.start()\n\nfor process in processes:\n    process.join()\n
Run Code Online (Sandbox Code Playgroud)\n

然而,在我的基于 Intel 的 Mac 上,它运行良好。

\n

我期望的是

\n
-1\n0\n1\n2\n3\n4\n5\n6\n7\n8\n9\n
Run Code Online (Sandbox Code Playgroud)\n

但相反,我收到了一个错误:

\n
RuntimeError: \n        An attempt has been made to start a new process before the\n        current process has finished its bootstrapping phase.\n\n        This probably means that you are not using fork to start your\n        child processes and you have forgotten to use the proper idiom\n        in the main module:\n\n            if __name__ == '__main__':\n                freeze_support()\n                ...\n\n        The "freeze_support()" line can be omitted if the program\n        is not going to be frozen to produce an executable.\nTraceback (most recent call last):\n  File "/Users/lance/Documents/Carleton Master Projects/Carleton-Master-Thesis/experiment.py", line 7, in <module>\n    manager = multiprocessing.Manager()\n  File "/Library/Developer/CommandLineTools/Library/Frameworks/Python3.framework/Versions/3.8/lib/python3.8/multiprocessing/context.py", line 57, in Manager\n    m.start()\n  File "/Library/Developer/CommandLineTools/Library/Frameworks/Python3.framework/Versions/3.8/lib/python3.8/multiprocessing/managers.py", line 583, in start\n    self._address = reader.recv()\n  File "/Library/Developer/CommandLineTools/Library/Frameworks/Python3.framework/Versions/3.8/lib/python3.8/multiprocessing/connection.py", line 250, in recv\n    buf = self._recv_bytes()\n  File "/Library/Developer/CommandLineTools/Library/Frameworks/Python3.framework/Versions/3.8/lib/python3.8/multiprocessing/connection.py", line 414, in _recv_bytes\n    buf = self._recv(4)\n  File "/Library/Developer/CommandLineTools/Library/Frameworks/Python3.framework/Versions/3.8/lib/python3.8/multiprocessing/connection.py", line 383, in _recv\n    raise EOFError\nEOFError\n
Run Code Online (Sandbox Code Playgroud)\n

有没有类似的方法(也保持简单)在基于 M1 的 Mac 中并行化?

\n

dro*_*ang 9

我不确定为什么这在 Intel 机器上有效,但问题是所有与 MP 相关的代码都应该在里面if __name__ == '__main__':

import multiprocessing

def func(index: int):
    print(index)

if __name__ == '__main__':
    manager = multiprocessing.Manager()
    processes = []

    for i in range(-1, 10):
    p = multiprocessing.Process(target=func, args=(i,))
    processes.append(p)
    p.start()

    for process in processes:
        process.join()
Run Code Online (Sandbox Code Playgroud)

由于MP实际上启动了一个进程,因此新进程需要func从该模块导入函数来执行其任务。如果您不保护启动新进程的代码,它将在导入期间执行。