2013-07-10 59 views
2

我在Windows上使用Python 2.7上的multiprocessing模块,并且我有多个进程将数据放在共享队列上并将数据从共享队列中取出。我正在继承multiprocessing.Process来完成此操作,并将由multiprocessing.Manager()作为参数的队列代理作为参数传递给__init__。在,所以我见过的人其他的答案通过此队列代理到map_async作为参数,但是当我试图把它作为参数传递给__init__方法我得到的错误:多处理。使用共享队列的进程子类

TypeError: Pickling an AuthenticationString object is disallowed for security reasons 

所以我很理解在Windows上通过实例化的东西Process子类必须是可以使用的,并且需要在这些共享对象上有一个authkey(这可以防止酸洗)。但为什么你可以给这个队列代理map_async而不是Process的子类?除了重写我的Process子类作为函数之外,是否还有其他解决方法?

回答

3

map_async不等同于初始化/运行Process与给定的参数,apply_async是。 map_async需要一个迭代,在你的例子中一个Manager.Queue,将它分成批次(有效地拆包/重新打包到一系列元组中),然后启动批次中的工人和手,而不是原始迭代。 apply_async,或者直接启动该过程,实际上会将您提供给工人的确切对象作为参数传递给工人。您也恰好在使用Manager中的代理Queue,并且由Manager生成的所有代理都有一个连接到它们的AuthenticationString成员,由于安全原因,您的错误状态是不可取的,因此无法传播到工人。

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

顺便说一下,从我的代码读取至少,它看起来像使用Manager.Queue,甚至一个普通的旧multiprocessing.QueueQueue作为输入map_async是相当没有意义的,为被映射到父被完全消耗的迭代在任何员工被创造之前的过程,然后再也没有看过。

+0

所以我最初在Linux上使用这个代码,并没有使用'multiprocessing.Queue'的问题。当我在Windows上运行这段代码时,它给了我一个错误,指出队列只能通过继承来共享,所以我认为我可以共享队列代理(显然不是)。我不清楚究竟我该如何从队列中继承 - 每个“Process”实例如何共享? – thyme

+0

你基本上回答了我的问题,只是好奇而已。 – thyme

+0

实际上,看一下直接使用文档中的'Manager'的例子,我并不清楚该例子是如何工作的。当我在之前(在Windows上)使用'multiprocess.Queue'时,在创建'Process'时,我只是在'args'中提供了它。你有什么特别的错误? –

相关问题