【发布时间】:2018-12-02 08:54:46
【问题描述】:
我想将一个多处理任务封装到一个类中。控制和工作函数都是该类的成员。工作人员使用Pool.map_async() 运行,因此可以在其他工作人员仍在运行时处理结果。处理结果存储在multiprocessing.Queue 中。 Queue是实例变量时不起作用,而全局变量或类变量则起作用。
例子:
import multiprocessing
class A():
# Queue as instance variable
def __init__(self):
self.qout = multiprocessing.Queue()
def worker(self,x):
self.qout.put(x*x)
def process(self):
values = range(10)
with multiprocessing.Pool() as pool:
res = pool.map_async(self.worker,values)
while (not self.qout.empty() or
not res.ready()):
val = self.qout.get()
print(val)
qoutB = multiprocessing.Queue()
class B():
# Queue as global variable
def __init__(self):
pass
def worker(self,x):
qoutB.put(x*x)
def process(self):
values = range(10)
with multiprocessing.Pool() as pool:
res = pool.map_async(self.worker,values)
while (not qoutB.empty() or
not res.ready()):
val = qoutB.get()
print(val)
class C():
# Queue as Class variable
qout = multiprocessing.Queue()
def __init__(self):
pass
def worker(self,x):
self.qout.put(x*x)
def process(self):
values = range(10)
with multiprocessing.Pool() as pool:
res = pool.map_async(self.worker,values)
while (not self.qout.empty() or
not res.ready()):
val = self.qout.get()
print(val)
现在,当您按如下方式调用类时(将其放在类定义下方)
a=A()
a.process()
不起作用(可能会停止等待self.qout.get(),但是
a=B()
a.process()
和
a=C()
a.process()
works(打印结果)。为什么?
我在Python documentation 中没有找到任何相关信息。我没有尝试将队列作为参数传递,但它是一个应该对用户隐藏的功能。
B 选项应该没有问题,C 并不理想,因为队列将在类的所有实例之间共享。
注意:这是在 Linux 上测试的(Debian,来自存储库的 Python 3.5)。
【问题讨论】:
-
在
A类中,队列是一个实例属性,而不是一个其他的类变量——所以你使用了错误的术语。您应该尝试创建一个实际的类变量,看看会发生什么。 -
抱歉术语有误,将解决问题。但是,如果队列是类变量,它会在所有实例之间进行分配,不是吗。这不是我们想要的行为。
-
我明白了。如果没有其他问题,您应该尝试一下,看看是否存在相同的问题(即使您无法使用该技术)。
-
好的,如果队列是类变量的话,它可以工作...
-
这是在 Windows 上吗?另外——一如既往——“不起作用”是什么意思?
标签: python class queue multiprocessing