Форк процесса под 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 и т.д.