Очередь мультипроцессинга внутри Manger.Namespace()
В настоящее время я создаю класс, который должен выполнять некоторые методы многопоточным способом, используя multiprocessing
модуль. Я выполняю реальные вычисления, используя Pool
из n
работников. Теперь я хотел назначить каждый из n
Активные работники индекс между 0
а также n
для какого-то другого расчета. Для этого я хотел использовать общий Queue
назначить индекс таким образом, чтобы в каждый момент времени два рабочих не имели одинаковый идентификатор. Поделиться тем же Queue
внутри класса между различными потоками, я хотел бы сохранить его внутри Manager.Namespace()
, Но при этом у меня возникли проблемы с Queue
, Поэтому я создал минимальную версию своей проблемы и в итоге получил что-то вроде этого:
from multiprocess import Process, Queue, Manager, Pool, cpu_count
class A(object):
def __init__(self):
manager = Manager()
self.ns = manager.Namespace()
self.ns.q = manager.Queue()
def foo(self):
for i in range(10):
print(i)
self.ns.q.put(i)
print(self.ns.q.get())
print(self.ns.q.qsize())
a = A()
a.foo()
В этом коде выполнение останавливается перед вторым оператором печати - поэтому, я думаю, что на самом деле никакие данные не записываются в Queue
, Когда я удаляю namespace
связанные вещи код работает без нареканий. Это предполагаемое поведение multiprocessing
объекты и я что-то не так делаю? Или это какая-то ошибка?
1 ответ
Да не стоит использовать Namespace
Вот. когда вы положите Queue
возражать в manager.Namespace()
каждый процесс получит новый Queue
Например, все записи / чтения этих вновь созданных объектов очереди не имеют связи с родительским процессом, поэтому рабочие процессы не получат никаких сообщений. поделиться Queue
исключительно вместо этого.
кстати, вы упоминали "нить" много раз, но в контексте multiprocess
Модуль, рабочий - это процесс, а не поток.