相关问题出现在Why I can't use multiprocessing.Queue with ProcessPoolExecutor? 。我提供了部分答案以及解决方法,但承认这个问题引发了另一个问题,即为什么可以multiprocessing.Queue将实例作为参数传递给辅助函数。multiprocessing.Process
例如,以下代码在使用spawn或fork方法创建新进程的平台下会失败:
from multiprocessing import Pool, Queue
def worker(q):
print(q.get())
with Pool(1) as pool:
q = Queue()
q.put(7)
pool.apply(worker, args=(q,))
Run Code Online (Sandbox Code Playgroud)
上述提出:
RuntimeError: Queue objects should only be shared between processes through inheritance
但下面的程序运行没有问题:
from multiprocessing import Process, Queue
def worker(q):
print(q.get())
q = Queue()
q.put(7)
p = Process(target=worker, args=(q,))
p.start()
p.join()
Run Code Online (Sandbox Code Playgroud)
看来,多处理池工作函数的参数最终会放在池的输入队列上,该队列是作为 a 实现的,multiprocessing.SimpleQueue并且您不能将实例放入使用 a进行序列化的实例中。multiprocessing.Queuemultiprocessing.SimpleQueueForkingPickler
那么,multiprocessing.Queue当作为参数传递给 a …