Подтвердить что ты не робот

Какой питонический способ справиться с рабочими процессами, которые должны координировать свои задачи?

В настоящее время я изучаю Python (с фона Java), и у меня есть вопрос о том, что я использовал бы потоки в Java.

Моя программа будет использовать рабочих для периодического чтения некоторых веб-сервисов. Каждый работник периодически будет вызывать веб-сервис в разное время.

Из того, что я прочитал, предпочтительнее использовать модуль multiprocessing и настроить рабочих как самостоятельные процессы, которые выполняют свои задачи сбора данных. На Java я бы сделал что-то концептуально похожее, но используя потоки. Хотя кажется, что я могу использовать потоки в Python, я проиграю при использовании нескольких процессоров.

Вот мужество моего вопроса: интернет-сервис задушен, а именно: рабочие не должны называть его больше, чем х раз в секунду. Каков наилучший способ для работников проверить, могут ли они запрашивать данные?

Я запутался в том, что это должно быть достигнуто с помощью:

  • Трубы как способ связи с каким-либо другим "управляющим объектом", который контролирует общие вызовы в секунду.
  • Что-то в строках nmap, чтобы поделиться некоторыми данными/значением между процессами, которые описывают, могут ли они вызвать веб-службу.
  • Объект Manager(), который отслеживает вызовы в секунду и сообщает рабочим, если у них есть разрешение на выполнение своих вызовов.

Конечно, я думаю, это может привести к тому, что я отслеживаю звонки в секунду. Я полагаю, что одним из вариантов было бы, чтобы рабочие вызывали функцию на какой-то другой объект, что делает вызов веб-службе и записывает текущее количество вызовов/сек. Другим вариантом будет функция, которая вызывает веб-сервис для жизни внутри каждого рабочего, и для них сообщение управляющего объекта при каждом вызове веб-службы.

Мысли приветствуются!

4b9b3361

Ответ 1

Передайте поиск в отдельный процесс, который ставит очередь запросов до тех пор, пока не станет их очередь.

Ответ 2

Я думаю, что вы обнаружите, что модуль multiprocessing предоставит вам некоторые довольно знакомые конструкции.

Вы можете обнаружить, что multiprocessing.Queue полезно для подключения рабочих потоков к управляющему потоку, который может обеспечить мониторинг или дросселирование.

Ответ 3

Не совсем ответ на ваш вопрос, но альтернативный подход к вашей проблеме: вы можете избавиться от проблем синхронизации при выполнении запросов, управляемых событиями, например. используя асинхронный модуль Python или Twisted. Вы не выиграли бы от нескольких процессоров/ядер, но в контексте сетевой коммуникации, которая обычно незначительна.