Выход SocketIO из асинхронного работника Celery не работает

Я использую Flask-SocketIO для создания системы уведомлений в реальном времени. Существует внешний сервер API, который вызывает сервер socketio в отдельном потоке через RPC. Метод, вызываемый RPC, создает задачу Celery, которая при использовании вызывает метод, вызывающий socketio.emit(). Однако сообщение, похоже, на самом деле не отправляется, поскольку в клиенте javascript сообщение не получено. Мой инстинкт подсказывает мне, что, поскольку рабочий процесс Celery выполняется в отдельном процессе, вызываемый метод socketio.emit() не отправляет подключенному клиенту, хотя объекты существуют в одном и том же месте в памяти. На сервере работает gevent, а Celery получает и выполняет задачи, как видно из журналов. Кроме того, я проверил, что socketio.emit() вызывается работником Celery, и я проверил, что когда задача вызывается напрямую, минуя Celery, socketio работает должным образом. Любые идеи о том, как заставить socketio правильно общаться, когда на него ссылается задача сельдерея в отдельном процессе?


person Mitch Skiles    schedule 16.08.2014    source источник
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
comment
Для тех, кто ищет, это решает 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