Запустите Django Channels Worker в том же процессе - PullRequest
1 голос
/ 07 октября 2019

Мне нужно настроить работника, который обрабатывает некоторые данные после определенного события. Я знаю, что могу запустить рабочий с python manage.py runworker my_worker, но мне нужно было бы запустить рабочий в том же процессе, что и основное приложение Django, в отдельном потоке.

Зачем он мне нужен в отдельнома нить не в отдельном процессе? Потому что работник будет выполнять довольно легкую работу, которая не будет перегружать ресурсы сервера, и, кроме того, усилия по настройке для нового процесса в производственном процессе не стоят выигрыша в производительности. Другими словами, я бы предпочел оставить это в процессе Джанго, если это возможно.

Почему бы не выполнить работу синхронно? Потому что это отдельная логика, которую необходимо расширить, и она выходит за пределы основной области HTTP-запросов-ответов. Это задача постобработки, которая не мешает основной логике. Мне нужно отделить эту задачу с точки зрения инфраструктуры, а не только с точки зрения логики (например, с помощью простых сигналов).

Есть ли какая-либо возможность, предоставляемая Django Channels , для запуска работника втакой способ? Будут ли какие-либо недостатки запускать рабочий вручную в отдельном потоке?

Прямо сейчас у меня есть настройка для потока потребителя брокера сообщений (без использования Каналы ), поэтому у меня есть записьточка для запуска нового рабочего потока. Но, как я видел из команды Channel runworker, она загружает все приложение, поэтому не кажется, что наивный вызов worker.run() является правильным способом сделать это (яможет быть не так с этим).

1 Ответ

0 голосов
/ 10 октября 2019

Я нашел ответ на свой вопрос.

Ответ: нет , вы не можете просто запустить работника в том же процессе. Это связано с тем, что потребитель должен работать внутри потока цикла событий, и совсем нехорошо иметь более одного потока цикла событий в одном и том же процессе (приложение Django WSGI уже запускает основной поток с циклом событий).

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

...