Я хочу заключить многопроцессорную задачу в класс.И управляющие, и рабочие функции являются членами класса.Рабочие работают с использованием Pool.map_async()
, поэтому результаты могут быть обработаны, пока другие рабочие еще работают.Результаты для обработки сохраняются в multiprocessing.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()
работает (печатаетрезультаты). Почему?
Я не нашел соответствующей информации в документации Python . Я не пытался передать очередь в качестве аргумента, но это особенность, которая должна бытьскрыто от пользователя.
Опция B должна быть исключена, C не идеален, поскольку очередь будет разделена между всеми экземплярами класса.
Примечание : Это протестировано в Linux (Debian, Python 3.5 из репозитория).