Форк процесса под uwsgi, django

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

Localhost (python manage.py runserver):

  • при получении запроса от браузера я делаю p = Process(target=workload); p.start(); return redirect(...). Браузер сразу же выполняет редирект, и рабочий процесс начинается в фоновом режиме.

UWSGI (2 рабочих):

  • Запускается фоновый процесс, но браузер не перенаправляется. Он ждет, пока дочерний процесс не выйдет.

Примечание, я добавил close-on-exec=true (как советуется в документации и в Running a subprocess in uwsgi application) параметр в конфигурации UWSGI, но это не имеет видимого эффекта, приложение ожидает выхода дочернего приложения

Я полагаю, что Python запутался, поскольку интерпретатором multiprocessing.Process() по умолчанию является двоичный интерпретатор uwsgi, а не обычный интерпретатор Python.

Кроме того, возможно, вы используете метод fork spawn (в зависимости от ОС), и форк рабочего uWSGI - не самая лучшая идея.

Вам, вероятно, потребуется вызвать multiprocessing.set_executable() и multiprocessing.set_spawn_method(), когда вы работаете под uWSGI, например, в вашем Django settings.py:

import multiprocessing
import sys

try:
    import uwsgi  # magic module only available when under uwsgi
except ImportError:
    uwsgi = None

if uwsgi:
    multiprocessing.set_spawn_method('spawn')
    multiprocessing.set_executable(os.path.join(sys.exec_prefix, 'python'))

Однако, вы можете рассмотреть возможность использования, например, системы спулера uWSGI или какой-либо другой системы рабочих очередей/фоновых задач, таких как Huey, rq, Minique, Celery и т.д.

Вернуться на верх