gpt4 book ai didi

python - multiprocessing.Process 子类使用共享队列

转载 作者:太空宇宙 更新时间:2023-11-04 01:26:24 32 4
gpt4 key购买 nike

我在 Windows 上的 Python 2.7 上使用 multiprocessing 模块,我有多个进程将数据放入共享队列和从共享队列中取出数据。我将 multiprocessing.Process 子类化来执行此操作,并将由 multiprocessing.Manager() 创建的队列代理作为参数传递给 __init__。在 SO 的其他答案中,我看到人们将此队列代理作为参数传递给 map_async,但是当我尝试将其作为参数传递给 __init__ 方法时,我得到错误:

TypeError: Pickling an AuthenticationString object is disallowed for security reasons

所以我了解到,在 Windows 上,您传递给实例化 Process 子类的东西必须是 pickle-able,并且这些共享对象上需要有一个 authkey(它可以防止 pickling)。但是,为什么可以将该队列代理提供给 map_async 而不是 Process 子类?除了将我的 Process 子类重写为函数之外,还有什么好的解决方法吗?

最佳答案

map_async 不等同于使用给定参数初始化/运行 Processapply_async 是。 map_async 采用一个可迭代对象,在您的示例中是一个 Manager.Queue,将其分成批处理(有效地将其解包/重新打包为一系列元组),然后启动 worker 分批处理,而不是原来的可迭代。 apply_async,或者只是直接启动流程,实际上将您提供的确切对象作为参数之一传递给工作人员。您还碰巧使用了来自 Manager 的代理 Queue,并且 Manager 生成的所有代理都有一个 AuthenticationString 附加到它们的成员,正如您的错误状态,出于安全原因,它是不可更改的,因此不能向下传播给工作人员。

您使用 Manager 来生成您的 Queue 是否有原因?除非你通过网络或其他方式使用它,否则你应该使用标准的 multiprocessing.Queue 就好了,它不会有 picklability 问题(因为它源于 Manager 代理)。

顺便说一句,至少从我对代码的阅读来看,它看起来像是在使用 Manager.Queue,甚至是常规的旧 multiprocessing.QueueQueue 作为 map_async 的输入是毫无意义的,因为被映射的可迭代对象在创建任何 worker 之前就已在父进程中完全消耗掉,然后再也不会查看。

关于python - multiprocessing.Process 子类使用共享队列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17578844/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com