在多个工作进程之间共享队列
多处理模块提供了创建和管理多个进程以同时执行任务的机制。一种常见的用例是让工作进程将其结果报告回中央进程。这就是队列发挥作用的地方。然而,当使用 apply_async 生成工作进程时,在它们之间共享队列可能具有挑战性。
错误:仅用于继承的队列对象
当尝试传递如果直接将队列应用到apply_async,则可能会遇到RuntimeError:“队列对象只能通过继承在进程之间共享。”此错误表示队列实例只能在通过继承直接相关的进程之间共享。在提供的代码中,工作进程不是从主进程继承的,因此出现错误。
解决方案:使用 multiprocessing.Manager
要克服此继承限制,多处理提供了 Manager 类。 Manager 提供了一种创建可在多个进程(包括队列)之间共享的对象的方法。通过利用 Manager,我们可以创建一个可供所有工作进程访问的队列,而无需继承。
重构代码:
以下代码演示了如何共享使用 multiprocessing.Manager 的工作进程之间的队列:
import multiprocessing def worker(name, que): que.put("%d is done" % name) if __name__ == '__main__': pool = multiprocessing.Pool(processes=3) m = multiprocessing.Manager() q = m.Queue() workers = pool.apply_async(worker, (33, q))
在此代码中,Manager() 创建一个管理器实例 m,然后用于实例化共享队列 q。该队列作为参数传递给 apply_async 方法,允许工作进程访问并向其写入结果。这种方法可以通过共享队列在工作进程和主进程之间进行通信,从而消除了继承错误的可能性。
以上是如何在 Python 的多处理模块中的工作进程之间安全地共享队列?的详细内容。更多信息请关注PHP中文网其他相关文章!