Как отправить сообщение socketio вне обработчика событий - PullRequest
1 голос
/ 07 мая 2020

Я пытаюсь отправить сообщение из задачи сельдерея. Однако сообщение 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 Мигеля Гринберга , которое отлично работает
...