小编Fan*_*Bao的帖子

为什么在 Python3.8+ `multiprocessing` 中使用“fork”有效但使用“spawn”失败?

我在 macOS 上工作,最近被 Python 3.8 多处理中的“fork”到“spawn”的变化所困扰(请参阅文档)。下面显示了一个简化的工作示例,其中使用“fork”成功,但使用“spawn”失败。代码的目的是创建一个支持size()在 macOS 下调用的自定义队列对象,从而继承该Queue对象并获取多处理的上下文。

import multiprocessing
from multiprocessing import Process
from multiprocessing.queues import Queue
from time import sleep


class Q(Queue):
    def __init__(self):
        super().__init__(ctx=multiprocessing.get_context())
        self.size = 1

    def call(self):
        return print(self.size)


def foo(q):
    q.call()


if __name__ == '__main__':
    multiprocessing.set_start_method('spawn')  # this would fail
    # multiprocessing.set_start_method('fork')  # this would succeed
    q = Q()
    p = Process(target=foo, args=(q,))
    p.start()
    p.join(timeout=1)

Run Code Online (Sandbox Code Playgroud)

使用“spawn”时输出的错误消息如下所示。

Process Process-1:
Traceback (most recent call last):
  File "/usr/local/Cellar/python@3.8/3.8.5/Frameworks/Python.framework/Versions/3.8/lib/python3.8/multiprocessing/process.py", line 315, in …
Run Code Online (Sandbox Code Playgroud)

multiprocessing spawn python-3.8

4
推荐指数
1
解决办法
2786
查看次数

标签 统计

multiprocessing ×1

python-3.8 ×1

spawn ×1