multiprocessing.Process子类使用共享队列

时间:2013-07-10 19:01:51

标签: python

我在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子类的东西必须是可以发现的,并且需要在这些共享对象上有一个authkey(这会阻止酸洗)。但是为什么你可以将该队列代理提供给map_async而不是Process子类?除了将我的Process子类重写为函数之外,还有什么好办法吗?

1 个答案:

答案 0 :(得分:3)

map_async不等同于使用给定参数初始化/运行Processapply_async是。 map_async采用可迭代的,在您的示例中为Manager.Queue,将其拆分为批次(有效地将其拆分/重新打包为一系列元组),然后启动工作人员并将批次交给批次,而不是原始的可迭代。 apply_async,或者直接启动进程,实际上将您提供的确切对象作为其参数之一传递给worker。您也恰好使用Queue中的代理Manager,并且Manager生成的所有代理都附加了AuthenticationString成员,因为您的错误状态,出于安全原因不可销售,因此不能传播给工人。

您是否有理由使用Manager制作Queue?除非您通过网络或其他方式使用它,否则使用标准multiprocessing.Queue就可以了,它不具备可挑选性问题(因为它来自于Manager代理)。

顺便说一句,至少在我阅读代码时,看起来好像使用Manager.Queue,甚至是常规的multiprocessing.QueueQueue作为map_async的输入因为映射的可迭代在创建任何工作者之前在父进程中被完全消耗,所以从未再次查看过。