Многопоточность Сокол в Python

Я создаю REST API для приложения, использующего Falcon. При запуске двух или более запросов к API на разных конечных точках многопоточное выполнение не выполняется (один запрос должен быть выполнен для выполнения следующего)

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

Я использую wsgiref simple_server для обслуживания запросов:

if __name__ == '__main__':
    httpd = simple_server.make_server('127.0.0.1', 8000, app)
    httpd.serve_forever()

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

3 ответа

Возможно, сервер не работает в многопроцессорном или многопоточном режиме.

Но даже если бы это было так, не стоит занимать веб-сервер для длительных задач. Долгосрочные задачи должны выполняться другими рабочими процессами.

Посмотрите на сельдерея

zaher идеале вы должны использовать giorgosp в giorgosp упоминания giorgosp, но если обязательно вернуть результат для запроса API, вы можете использовать Gunicorn

gunicorn --workers 3 -b localhost:8000 main:app --reload

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

В идеале ни один из рабочих не может быть

cpu_count * 2 + 1

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

Опция main:app сообщает Gunicorn, чтобы он вызывал приложение объекта приложения, доступное в файле main.py.

Gunicorn предоставляет дополнительный переключатель --reload, который сообщает Gunicorn обнаруживать любые изменения кода на лету. Таким образом, вы можете изменить свой код без перезапуска Gunicorn.

И если этот подход не подходит для ваших нужд, то я думаю, что вы должны использовать Торнадо вместо Сокола.

Дайте мне знать, если понадобятся дальнейшие разъяснения.

Это может быть легко достигнуто путем соединения Falcon с Gunicorn. С Gunicorn достижение многопоточности / многопроцессорной обработки будет относительно проще без необходимости внедрения Celery (хотя ничто не мешает реализовать его. Celery - это здорово!)

gunicorn -b localhost:8000 main:app --threads 3 --workers 3 --reload

Приведенная выше команда ускорит 3 рабочих с каждым рабочим, имеющим 3 потока. Вы, как разработчик, можете настроить необходимое количество рабочих и потоков. Я бы настоятельно рекомендовал понять разницу между многопоточностью и многопроцессорностью перед настройкой этих настроек.

Другие вопросы по тегам