Поделиться ресурсом между двумя процессами - PullRequest
1 голос
/ 02 июня 2011

Я хочу ознакомиться с рекомендациями , чтобы разделить очередь (ресурс) между двумя процессами в Python.Вот что делает каждый процесс:

Process_1: непрерывно получает данные (в формате json) из потокового API

Process_2: isдемон (подобный коду Сандера Марешала ), который фиксирует данные (по одному) в базе данных

Итак, Process_1 (или Производитель) помещает единицуданные на этот общий ресурс, и Process_2 (или получатель) будет опрашивать этот общий ресурс для любых новых единиц данных и сохранять их в БД, если таковые имеются.

Есть несколько вариантовчто пришло мне в голову:

  • Использование рассола (недостаток: дополнительные накладные расходы на травление и снятие травления)
  • Передача данных через stdout Process_1 в stdin Process_2 (недостаток: нет, но не уверен, как реализовать это с помощью демона)
  • Использование объекта pool в библиотеке multiprocessing (недостаток: не уверен, как кодировать это, поскольку один процесс является демоном)

Я хотел бы получить оптимальное решение, практикуемое в этом отношении, сом код :).Спасибо.

1 Ответ

5 голосов
/ 02 июня 2011

multiprocessing.pool не то, что вам нужно в этом случае - это полезно для выполнения нескольких единиц работы «в фоновом режиме» (одновременно), а не для управления общим ресурсом. Поскольку у вас, кажется, есть отработанный формат сообщений, и они общаются только в одном направлении, вам нужен multiprocessing.Queue - документация имеет хороший пример того, как его использовать - вы будете хотите, чтобы ваш Process_1 помещал данные в очередь по мере необходимости, а Process_2 вызывал q.get () в бесконечном цикле. Это заставит потребителя блокировать, когда делать нечего, вместо того, чтобы ждать, как вы предлагаете (что может тратить циклы процессора). Проблема, которую он оставляет, заключается в закрытии демона - возможно, лучший способ состоит в том, чтобы продюсер поместил значение часового в конец очереди, чтобы гарантировать, что получатель обрабатывает все запросы. Другие альтернативы включают такие вещи, как попытка принудительно завершить процесс при выходе из дочернего процесса, но это подвержено ошибкам.

Обратите внимание, что это предполагает, что Производитель порождает Потребителя (или наоборот) - если Потребитель является долгосрочным демоном, который может иметь дело с несколькими относительно недолговечными Производителями, ситуация становится немного более сложной - нет t, насколько мне известно, любой кроссплатформенный высокоуровневый модуль IPC; самый переносимый (и, как правило, самый простой) способ справиться с этим может заключаться в использовании файловой системы в качестве очереди - иметь папку спулинга где-нибудь, куда производители пишут текстовый файл для каждого запроса; Потребитель может затем обработать их на досуге - однако, это не без его собственных проблем: вам нужно было бы убедиться, что Потребитель не пытается открыть наполовину написанный файл инструкции, что Производители не наступают пальцы друг друга, и что производители и потребители согласовывают порядок запросов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...