我在 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)