Python 多处理。使用共享队列的进程子类

Python 多处理。使用共享队列的进程子类,python,Python,我在Windows上使用Python2.7上的多处理模块,我有多个进程将数据放入共享队列并从中取出数据。为此,我将对多处理.Process进行子类化,并将多处理.Manager()生成的队列代理作为参数传递给\uuu init\uu。在上的其他答案中,我看到人们将此队列代理作为参数传递到map\u async,但当我尝试将其作为参数传递给\uuuuuu init\uuuu方法时,我得到了错误: TypeError: Pickling an AuthenticationString object

我在Windows上使用Python2.7上的
多处理
模块,我有多个进程将数据放入共享队列并从中取出数据。为此,我将对
多处理.Process
进行子类化,并将
多处理.Manager()
生成的队列代理作为参数传递给
\uuu init\uu
。在上的其他答案中,我看到人们将此队列代理作为参数传递到
map\u async
,但当我尝试将其作为参数传递给
\uuuuuu init\uuuu
方法时,我得到了错误:

TypeError: Pickling an AuthenticationString object is disallowed for security reasons

因此,我知道在Windows上,传递给实例化
进程
子类的东西必须是可pickle的,并且这些共享对象上需要有一个authkey(这可以防止pickle)。但是为什么您可以将队列代理指定给
map\u async
,而不是
进程
子类?除了将我的
进程
子类重写为函数之外,还有什么好办法吗?

map\u async
不等同于使用给定参数初始化/运行进程,
apply\u async
map\u async
接受一个iterable,在您的示例中是一个
Manager.Queue
,将其拆分为多个批次(有效地将其解包/重新打包为一系列元组),然后启动Worker并放弃批次,而不是原始iterable
apply_async
,或者直接启动流程,实际上会将您提供的确切对象作为其参数之一传递给worker。您还碰巧使用了来自
管理器的代理
队列
,并且由
管理器
生成的所有代理都有一个
AuthenticationString
成员附加到它们,正如您的错误所述,出于安全原因,该成员是不可访问的,因此无法向下传播到工作人员

您使用
管理器生成
队列
有什么原因吗?除非您是通过网络或其他方式使用它,否则使用标准的
多处理.Queue
,您应该不会有可拾取性问题(因为它源于
管理器
代理)


顺便说一句,至少从我对代码的阅读来看,似乎使用
管理器.Queue
,甚至使用常规的
多处理.Queue
Queue
作为
映射异步
的输入是毫无意义的,由于映射的iterable在创建任何工作进程之前就已在父进程中完全消耗,因此再也没有查看过。

因此,我最初在Linux上使用此代码,并且在使用
多处理.Queue时没有任何问题。
。当我在Windows上运行这段代码时,它给了我一个错误,指出队列只能通过继承来共享,所以我认为我可以共享队列代理(显然不能)。我不清楚我将如何从队列继承-每个
如何处理
实例共享?你基本上回答了我的问题,只是在这一点上感到好奇。实际上,查看直接从文档中使用
管理器的示例,我也不是100%清楚该示例是如何工作的。以前(在Windows上)使用过
multiprocess.Queue
时,我只是在创建
进程时在
args
中提供了它。具体的错误是什么?
RuntimeError:Queue对象只能通过继承在进程之间共享
我实际上是在调用
pickle.dumps时得到的(只是用于调试,因为我之前得到了相当神秘的EOFerror,我怀疑错误与酸洗有关。因此,一旦您看到它,这是很明显的,但事先不是直观的。
Pool
创建自己的工作者
进程
es,然后实际将工作者函数作为参数推送到工作队列。这意味着您的整个流程对象和队列在每次任务运行时都必须被pickle/unpickle。如果您想使用自定义的
流程
子类而不是将worker作为函数来编写,那么您似乎还需要子类
来创建和运行子类的实例。