Очередь мультипроцессинга внутри 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 Модуль, рабочий - это процесс, а не поток.

Другие вопросы по тегам