Как использовать несколько процессов в Python для непрерывной рабочей нагрузки - PullRequest
0 голосов
/ 16 мая 2019

У меня есть приложение на python, запущенное внутри модуля в kubernetes, которое подписывается на тему паба / подписки Google и при каждом сообщении загружает файл из корзины Google.

У меня проблема в том, что я не могу достаточно быстро обработать рабочую нагрузку с помощью однопоточного приложения Python. Обычно я запускаю несколько модулей для обработки рабочей нагрузки, но проблема в том, что все файлы должны оказаться в одной и той же файловой системе для обработки другим приложением.

Я пытался создавать новую ветку для каждого запроса, но объем слишком велик.

Что я хотел бы сделать, это: 1) иметь ряд процессов, которые могут обрабатывать новые сообщения 2) Поддерживайте процессы в рабочем состоянии и используйте их для ответа на новые поступающие запросы.

Все примеры многопроцессорной обработки в python - это примеры с одной рабочей нагрузкой, например, предоставление 10 чисел квадратной функции, а это не то, чего я пытаюсь достичь.

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

1 Ответ

0 голосов
/ 16 мая 2019

В первой попытайтесь отделить задачу, связанную с вводом-выводом (например, запрос, чтение / запись и т. Д.), От задачи, связанной с ЦП (анализ JSON / XML, вычисление и т. Д.). Для случая ввода-вывода используйте Threading или ThreadPoolExecutor примитивы для автоматического повторного использования рабочего потока. Держите внимание, запись на диск является функцией блокировки!

Если вы хотите использовать параллелизм для пользователя с процессором Обработка или ProcessPoolExecutor . Для их синхронизации вы можете использовать общий объект (прокси-объект) или файл или pipe или redis и т. Д.

Если вы хотите использовать чистый python, предпочтительнее использовать общие объекты, такие как Managers (пространства имен, dicts и т. Д.).

Для работы с файлами, чтобы избежать блокировки, используйте отдельный поток или используйте async. Для asyncio используйте библиотеку aiofile .

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