Я использую Flask-SocketIO для создания системы уведомлений в реальном времени. Существует внешний сервер API, который вызывает сервер socketio в отдельном потоке через RPC. Метод, вызываемый RPC, создает задачу Celery, которая при использовании вызывает метод, вызывающий socketio.emit(). Однако сообщение, похоже, на самом деле не отправляется, поскольку в клиенте javascript сообщение не получено. Мой инстинкт подсказывает мне, что, поскольку рабочий процесс Celery выполняется в отдельном процессе, вызываемый метод socketio.emit() не отправляет подключенному клиенту, хотя объекты существуют в одном и том же месте в памяти. На сервере работает gevent, а Celery получает и выполняет задачи, как видно из журналов. Кроме того, я проверил, что socketio.emit() вызывается работником Celery, и я проверил, что когда задача вызывается напрямую, минуя Celery, socketio работает должным образом. Любые идеи о том, как заставить socketio правильно общаться, когда на него ссылается задача сельдерея в отдельном процессе?
Выход SocketIO из асинхронного работника Celery не работает
comment
вы, вероятно, не отправляете содержимое приложения работнику сельдерея
- person CESCO   schedule 15.09.2015
Ответы (2)
Вы забыли добавить message_queue?
socketio.init_app(app, message_queue='redis://localhost:6379/0')
person
xilixjd
schedule
07.04.2017
Для тех, кто ищет, это решает
runtime error: working outside of request context
при попытке испустить из задачи сельдерея
- person polymath; 07.05.2020
Вы можете запустить Celery в режиме multiprocessing
или eventlet
.
По умолчанию Celery использует multiprocessing
для настройки нового процесса для нового работника. Eventlet
использует потоки, которые, я считаю, вы хотите использовать в этом сценарии, поскольку вам нужна общая память.
Вы можете найти эту документацию полезной.
person
Muntaser Ahmed
schedule
10.01.2017