Я пытаюсь отправить сообщение из задачи сельдерея. Однако сообщение emit не доходит до клиента, даже при попытке трансляции:
@celery.task(bind=True)
def search_pdf(self, path, keyword, room):#, url):
socketio.emit('message', {'msg': 'results' + ':' + 'message from a celery'}, namespace='/chat', broadcast=True)
socketio.emit('message', {'msg': 'results' + ':' + 'message from a celery'}, broadcast=True)
После отладки кажется, что emit не достигает клиента всякий раз, когда я вызываю его за пределами обработчика события socketio, поэтому должно быть что-то, что я неправильно понимаю насчет flask-socketio
, может ли кто-нибудь просветить меня?
Для справки это мой вызов init в моей create_app()
функции:
socketio.init_app(app, async_mode='eventlet', message_queue=app.config['CELERY_BROKER_URL'])
А это мой сельдерей функция приложения:
def create_celery_app(app=None):
"""
Create a new Celery object and tie together the Celery config to the app's
config. Wrap all tasks in the context of the application.
:param app: Flask app
:return: Celery app
"""
app = app or create_app()
# app.app_context().push()
celery = Celery(app.import_name, broker=app.config['CELERY_BROKER_URL'],
include=CELERY_TASK_LIST)
celery.conf.update(app.config)
TaskBase = celery.Task
class ContextTask(TaskBase):
abstract = True
def __call__(self, *args, **kwargs):
with app.app_context():
return TaskBase.__call__(self, *args, **kwargs)
celery.Task = ContextTask
return celery
- Я использую Flask с сервером Gunicorn с рабочим классом
eventlet
для flask -socketio. - Я также использую docker -compose с контейнерами сельдерея и redis в качестве очереди задач
- И использую приложение чата socketio Мигеля Гринберга , которое отлично работает