Flask + Celery + Redis: consumer: не удается подключиться к amqp: // guest: **@127.0.0.1: 5672 //: истекло время ожидания

У меня есть простая задача с сельдереем. Чтобы запустить его, я сначала запустил redis-server, затем активировал виртуальный env и ввел "celery beat", открыл новое окно терминала, направляя его в виртуальный env, и ввел "celery worker"

Flask==1.0.2
celery==4.2.1
requests==2.19

Это сообщение об ошибке после этого:

consumer: Cannot connect to amqp://guest:**@127.0.0.1:5672//: timed out.

Это детали конфигурации, показанные после выполнения 'сельдерея':

Configuration -> . broker -> amqp://guest:**@localhost:5672// . loader -> celery.loaders.default.Loader . scheduler -> celery.beat.PersistentScheduler . db -> celerybeat-schedule . logfile -> [stderr]@%WARNING . maxinterval -> 5.00 minutes (300s)

флэш-проект / приложение / __ init__.py

from flask import Flask, request, jsonify
from celery import Celery
import celeryconfig

app = Flask(__name__)
app.config.from_object('config')

def make_celery(app):
    # create context tasks in celery
    celery = Celery(
        app.import_name,
        broker=app.config['BROKER_URL']
    )
    celery.conf.update(app.config)
    celery.config_from_object(celeryconfig)
    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

celery = make_celery(app)

@app.route("/")
def hello():
    return "Hello World!"

флэш-проект / задачи / test.py

import celery

@celery.task()
def print_hello():
    logger = print_hello.get_logger()
    logger.info("Hello")

Flask-proj / config.py

import os

REDIS_HOST = "127.0.0.1" REDIS_PORT = 6379 BROKER_URL = environ.get('REDIS_URL', "redis://{host}:{port}/0".format(
    host=REDIS_HOST, port=str(REDIS_PORT))) CELERY_RESULT_BACKEND = BROKER_URL

колба-proj / celeryconfig.py

from celery.schedules import crontab

CELERY_IMPORTS = ('app.tasks.test')
CELERY_TASK_RESULT_EXPIRES = 30
CELERY_TIMEZONE = 'UTC'

CELERY_ACCEPT_CONTENT = ['json', 'msgpack', 'yaml']
CELERY_TASK_SERIALIZER = 'json'
CELERY_RESULT_SERIALIZER = 'json'

CELERYBEAT_SCHEDULE = {
    'test-celery': {
        'task': 'app.tasks.test.print_hello',
        # Every minute
        'schedule': crontab(minute = "*"),
    }
}

Пожалуйста, дайте мне знать, если мне нужно предоставить другие детали.

можно попробовать изменить порядок строк celery.conf.update(app.config) celery.config_from_object(celeryconfig) на celery.config_from_object(celeryconfig) celery.conf.update(app.config ) в _в этом_.py

SUBHAM MAJAVADIYA 02.08.2018 22:02
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
1
3 390
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

amqp - это rabbitmq, а не redis.

Redis обычно

redis://:password@hostname:port/db_number

Я бы вручную настроил конфигурацию, чтобы увидеть, работает ли она.

flask_app.config.update(
    CELERY_BROKER_URL='redis://localhost:6379',
    CELERY_RESULT_BACKEND='redis://localhost:6379'
)

Спасибо за подсказку! Я думаю, что из-за того, что я не указал имя приложения, каким-то образом по умолчанию использовалось rabbitmq. Когда я запустил это: 'celery beat -A app.celery', он работает.

doyz 05.08.2018 17:07
Ответ принят как подходящий

Удалите строку celery.conf.update(app.config) из функции make_celery(), поэтому она будет такой:

def make_celery(app):
    # create context tasks in celery
    celery = Celery(
        app.import_name,
        broker=app.config['BROKER_URL']
    )
    celery.conf.update(app.config) # remove this line.
    celery.config_from_object(celeryconfig)
    TaskBase = celery.Task

а также, скопируйте и вставьте содержимое flask-proj/config.py в flask-proj/celeryconfig.py.

Значит он flask-proj/celeryconfig.py будет вроде,

from celery.schedules import crontab

import os

REDIS_HOST = "127.0.0.1"
REDIS_PORT = 6379
BROKER_URL = os.environ.get(
    'REDIS_URL', "redis://{host}:{port}/0".format(
        host=REDIS_HOST, port=str(REDIS_PORT)))
CELERY_RESULT_BACKEND = BROKER_URL

CELERY_IMPORTS = ('app.tasks.test')
CELERY_TASK_RESULT_EXPIRES = 30
CELERY_TIMEZONE = 'UTC'

CELERY_ACCEPT_CONTENT = ['json', 'msgpack', 'yaml']
CELERY_TASK_SERIALIZER = 'json'
CELERY_RESULT_SERIALIZER = 'json'

CELERYBEAT_SCHEDULE = {
    'test-celery': {
        'task': 'app.tasks.test.print_hello',
        # Every minute
        'schedule': crontab(minute = "*"),
    }
}

Спасибо, да, мне пришлось удалить эту строку. И не только это, я не указал имя приложения, оно каким-то образом по умолчанию было rabbitmq. Когда я запустил это: 'celery beat -A app.celery', он работает.

doyz 06.08.2018 03:31

Была такая же проблема в Django, но моя проблема оказалась в использовании «BROKER_URL» вместо «CELERY_BROKER_URL» в settings.py. Celery не находил URL-адрес и по умолчанию использовал порт rabbitmq вместо порта redis.

Другие вопросы по теме