Фоновые задачи демона в приложении фляги (uwsgi) - PullRequest
0 голосов
/ 28 июня 2018

Редактировать для уточнения моего вопроса: Я хочу подключить службу python к uwsgi, используя эту функцию (я не могу понять примеры), и я также хочу иметь возможность передавать результаты между ними. Ниже я представляю некоторый контекст, а также представляю свою первую мысль по вопросу коммуникации, ожидая, может быть, какого-нибудь совета или другого подхода.


У меня есть уже разработанное приложение Python, которое использует multiprocessing.Pool для запуска задач по требованию. Основная причина использования пула рабочих заключается в том, что мне нужно разделить несколько объектов между ними.

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

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

В этом ответе показана функция uWSGI для управления демоном / службами . Я хочу следовать этому подходу, чтобы использовать уже разработанное приложение Python в качестве службы приложения колбы.

Одна из моих главных проблем заключается в том, что я смотрю на примеры и не знаю, что мне нужно делать дальше. Другими словами, как мне запустить приложение Python оттуда?

Другая проблема связана с взаимодействием между приложением фляги и процессом / службой демона. Моя первая мысль - использовать flask-socketIO для связи, но затем, если мой сервер останавливается, мне нужно иметь дело с соединением ... Это хороший способ связи между сервером и службой? Каковы другие возможные решения?


Примечание: Я хорошо знаю о сельдерее и делаю вид, что использую его в ближайшем будущем. На самом деле, у меня есть уже разработанное приложение node.js, в котором пользователи выполняют действия, которые должны запускать конкретные задачи из (также) уже разработанного приложения Python. Дело в том, что мне нужна как можно скорее версия готовая к производству , и вместо того, чтобы модифицировать приложение python, использующее multiprocessing, я подумал, что будет быстрее создать простой флеш-сервер для связи с node.js через HTTP. Таким образом, мне нужно было бы реализовать только приложение колбы, которое создает приложение python.


Edit:

Зачем мне делиться объектами?

Просто потому, что создание объектов в вопросах занимает слишком много времени. На самом деле создание занимает приемлемое количество времени, если оно выполняется один раз, но, поскольку я ожидаю (может быть) от сотен до тысяч запросов одновременно, чтобы снова загрузить каждый объект, я бы хотел этого избежать.

Одним из объектов является модель классификатора scikit, сохраненная в файле pickle, загрузка которого занимает 3 секунды. Каждый пользователь может создать несколько «рабочих мест», каждый из которых займет более 2 тыс. Документов для классификации, каждый документ будет загружен в неизвестный момент времени, поэтому мне нужно загрузить эту модель в память (загрузка ее снова для каждой задачи не приемлемо).

Это один пример одной задачи.


Редактировать 2: Я задавал несколько вопросов, связанных с этим проектом ранее:

Как уже говорилось, но для уточнения: Я думаю, что лучшим решением было бы использование Celery, но чтобы быстро получить готовое к производству решение, я пытаюсь использовать это решение uWSGI Attach Daemon

1 Ответ

0 голосов
/ 28 июня 2018

Я вижу искушение держаться за multiprocessing.Pool. Я использую в производстве как часть конвейера. Но Celery (который я также использую в производстве) гораздо лучше подходит для того, что вы пытаетесь сделать, а именно для распределения работы по ядрам на ресурс, который стоит дорого настроить. Есть N ядер? Запустите N сельдереев, которые могут загружать (или, может быть, лениво загружать) дорогую модель как глобальную. Запрос приходит в приложение, запускает задание (например, task = predict.delay(args), ждет его завершения (например, result = task.get()) и возвращает ответ. Вы тратите немного времени на изучение сельдерея, чтобы сэкономить на написать связку координационного кода.

...