如何在 Python 的多处理模块中的工作进程之间安全地共享队列?

DDD
发布: 2024-10-19 18:47:02
原创
786 人浏览过

How to Share a Queue Safely Between Worker Processes in Python's Multiprocessing Module?

在多个工作进程之间共享队列

多处理模块提供了创建和管理多个进程以同时执行任务的机制。一种常见的用例是让工作进程将其结果报告回中央进程。这就是队列发挥作用的地方。然而,当使用 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中文网其他相关文章!

来源:php
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!