繁体   English   中英

Python 多处理与 M1 Mac

[英]Python multiprocessing with M1 Mac

我有一个 mac(Mac Os 11.1,Python Ver 3.8.2)并且需要在多处理中工作,但程序不起作用。

import multiprocessing


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


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()

但是,在我基于 Intel 的 Mac 上,它运行良好。

我期望的是

-1
0
1
2
3
4
5
6
7
8
9

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

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.
Traceback (most recent call last):
  File "/Users/lance/Documents/Carleton Master Projects/Carleton-Master-Thesis/experiment.py", line 7, in <module>
    manager = multiprocessing.Manager()
  File "/Library/Developer/CommandLineTools/Library/Frameworks/Python3.framework/Versions/3.8/lib/python3.8/multiprocessing/context.py", line 57, in Manager
    m.start()
  File "/Library/Developer/CommandLineTools/Library/Frameworks/Python3.framework/Versions/3.8/lib/python3.8/multiprocessing/managers.py", line 583, in start
    self._address = reader.recv()
  File "/Library/Developer/CommandLineTools/Library/Frameworks/Python3.framework/Versions/3.8/lib/python3.8/multiprocessing/connection.py", line 250, in recv
    buf = self._recv_bytes()
  File "/Library/Developer/CommandLineTools/Library/Frameworks/Python3.framework/Versions/3.8/lib/python3.8/multiprocessing/connection.py", line 414, in _recv_bytes
    buf = self._recv(4)
  File "/Library/Developer/CommandLineTools/Library/Frameworks/Python3.framework/Versions/3.8/lib/python3.8/multiprocessing/connection.py", line 383, in _recv
    raise EOFError
EOFError

在基于 M1 的 Mac 中是否有类似的方法(也很容易)来并行化?

我不确定为什么这适用于 Intel 机器,但问题是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()

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM