Python, использование удаленных менеджеров и многопроцессорность

Я хочу использовать функции удаленного менеджера в модуле multiprocessing для распределения работы между многими машинами. Я знаю, что есть сторонние модули, но я хочу как можно больше придерживаться ядра. Я знаю, что для настольных компьютеров (одна машина) вы можете использовать класс multiprocessing.Pool для ограничения количества процессоров, но у вас есть несколько вопросов с удаленными менеджерами.

У меня есть следующий код для удаленного менеджера:

  from multiprocessing.managers import BaseManager import Queue queue = Queue.Queue() class QueueManager(BaseManager): pass QueueManager.register('get_queue', callable=lambda:queue) m = QueueManager(address=('', 50000), authkey='abracadabra') s = m.get_server() s.serve_forever() 

Это отлично работает, и я могу даже отправить задание в очередь с помощью следующего кода:

 QueueManager.register('get_queue') m = QueueManager(address=('machinename', 50000), authkey='abracadabra') m.connect() queue = m.get_queue() queue.put('hello')QueueManager.register('get_queue') m = QueueManager(address=('localhost', 50000), authkey='abracadabra') m.connect() queue = m.get_queue() queue.put('hello') 

Вы также можете queue.get() чтобы получить одну запись в очереди.

  1. Как вы получаете предметы в очереди? Когда я пытался перебирать очередь, я ввожу бесконечный цикл.
  2. На рабочих можно ли ограничить каждую машину 1 заданием на машину?
  3. Поскольку этот метод, как представляется, является методом pull, когда работники должны проверять, существует ли работа, может ли быть метод push, при котором может запускаться сервер многопроцессорности?

One Solution collect form web for “Python, использование удаленных менеджеров и многопроцессорность”

Итерация по очереди такая же, как и:

 while True: elem = queue.get() #queue empty -> it blocks!!! 

Элегантный способ «перебора» по очереди и блокирования рабочего процесса, когда больше нет заданий для выполнения, заключается в том, чтобы использовать None (или что-то еще) в качестве дозорного и использовать iter(callable, sentinel) :

 for job in iter(queue.get, None): # execute the calculation output_queue.put(result) #shutdown the worker process 

Это эквивалентно:

 while True: job = queue.get() if job is None: break #execute the calculation output_queue.put(result) #shutdown the worker process 

Обратите внимание, что вам нужно вставить в queu часовое для каждого подпроцесса работника, иначе ожидаются подпроцессы.

Что касается вашего второго вопроса, я не понимаю, о чем вы спрашиваете. BaseManager предоставляет один сервер, который выполняет вызовы от клиентов, поэтому, очевидно, все запросы удовлетворяются одним и тем же компьютером. Или вы имеете в виду разрешить каждому клиенту делать только запрос? Я не вижу никаких вариантов для этого, даже если он может быть реализован «вручную».

Я не понимаю ваш вопрос. Что такое метод pull? Можете ли вы перефразировать свой вопрос немного подробнее о том, что вы подразумеваете под «методом push, где может запускаться сервер многопроцессорности»?

  • Запуск нескольких сценариев Python
  • Правильное проектирование пользовательского объекта Multiprocessing.Manager
  • Использование класса многопроцессорности Python.Process
  • Необходимо быстро создать большое количество новых процессов в Windows / Python
  • Вывод журнала многопроцессорности. Процесс
  • Обмениваться объектами с атрибутом дескриптора файла между процессами
  • Как я должен регистрироваться при использовании многопроцессорности в Python?
  • Возможно ли поведение Python defaultdict при многопроцессорной обработке?
  •  
    Interesting Posts for Van-Lav

    Есть ли способ включить код python в страницы moinmoin?

    Два основных вопроса ANTLR

    Pandas подсчитывает количество случаев, когда событие произошло за последние n дней по группам

    Быстрая матричная транспозиция в Python

    В чем разница с операторами Python, заканчивающимися на;?

    Python – объединить два словаря, объединить значения строк?

    Как предотвратить завершение запущенной программы с помощью «ctrl + c» в Linux с помощью python?

    Функция Wrapping C с аргументами указателя с использованием SWIG

    Элегантный способ получить значения во вложенных словарях для определенного ключа?

    Проблема с соединением Python-Oracle с Pyodbc

    LiveServerTestCase Django всегда сбой из-за конфликтующего адреса … Несмотря на отсутствие адреса

    Альтернативные цвета в штабелированном полоске matplotlib

    Зашифрованные и безопасные контейнеры докеров

    Самый эффективный способ сделать заявление if-elif-elif-else, когда else сделан больше всего?

    Слияние двух файлов CSV на основе данных из столбца

    Python - лучший язык программирования в мире.