由于某种原因,Celery似乎忽略了我的配置值。我在我的应用config.py
BROKER_URL = 'redis://localhost:6379/0'
CELERY_RESULT_BACKEND = 'redis://localhost:6379/0'
CELERY_RESULT_ENGINE_OPTIONS = {"pool_recycle": 7200, 'echo': True}
BROKER_TRANSPORT_OPTIONS = {'visibility_timeout': 3600}
然而,芹菜继续尝试连接到以下经纪人网址amqp://guest:**@localhost:5672//
这是我尝试配置芹菜的地方
def configure_extensions(app):
# flask-sqlalchemy
db.init_app(app)
# marshmallow
ma.init_app(app)
# bcrypt
bcrypt.init_app(app)
#celery
celery.config_from_object(app.config)
这是我的extensions.py
# Flask-SQLAlchemy extension instance
from flask_sqlalchemy import SQLAlchemy
# flask_marshmallow extension instance
from flask_marshmallow import Marshmallow
# Bcrypt
from flask_bcrypt import Bcrypt
# flask_restful
from flask_restful import Api
#celery
from celery import Celery
celery = Celery()
db = SQLAlchemy()
ma = Marshmallow()
bcrypt = Bcrypt()
api = Api()
我在调用app.config
之前打印出celery.config_from_object(app.config)
,它确实包含了我在上面列出的芹菜值。我已经看过堆栈溢出的类似帖子,还没找到一个回答我问题的帖子。
我正在使用python 3.6和芹菜4.1
有谁知道为什么忽略配置值?我已经检查了celery docs,我认为我正在使用正确的配置值
这是指向最小示例存储库Github Repo
的链接答案 0 :(得分:1)
Celery在Flask和应用程序工厂模式方面存在问题。 Miguel Grinberg写了一篇很棒的博客文章:
https://blog.miguelgrinberg.com/post/celery-and-the-flask-application-factory-pattern
基本上,您需要在创建时传入代理URL,而不是推迟它并稍后更新配置。
我修改了你的app/extensions.py
:
from celery import Celery
from . import celeryconfig
celery = Celery(__name__, broker=celeryconfig.broker_url,
backend=celeryconfig.result_backend)
现在,经营芹菜工人会产生以下结果:
bash# celery worker -A app.extensions
transport: redis://localhost:6379/0
results: redis://localhost:6379/0
答案 1 :(得分:0)
您正在混合带前缀的未加前缀的配置密钥。
只使用不带celery
前缀的小写。
还要确保实际使用配置文件。我不知道你的app
是什么。对于可导入的config_file.py
,请使用config_from_object('config_file')
。
答案 2 :(得分:0)
在Celery 4.0中,配置选项已更改为小写,有些已重命名。因此,您必须将配置参数更改为:
broker_url = 'redis://localhost:6379/0'
result_backend = 'redis://localhost:6379/0'
database_engine_options = {"pool_recycle": 7200, 'echo': True}
broker_transport_options = {'visibility_timeout': 3600}
有关详细信息,请参阅文档中的New lowercase settings部分。
答案 3 :(得分:0)
这对我有用:
app = Celery(
'tasks',
broker=f'sqs://{quote(CELERY_AWS_ACCESS_KEY_ID)}:{quote(CELERY_AWS_SECRET_ACCESS_KEY)}@',
)
app.conf.broker_transport_options = {
'queue_name_prefix': f'{ENV}-',
'region': 'eu-central-1',
}
如https://github.com/celery/celery/blob/master/t/unit/app/test_app.py#L694
中所示