我正在尝试使用SQS作为代理来设置Celery任务。我可以使用以下功能(最低可复制性)使其工作:
from celery import Celery
app = Celery('tasks', broker=f'sqs://{aws_access}:{aws_secret}@')
@app.task
def test(s):
print(s)
我运行此celery -A tasks worker --loglevel=INFO
,然后通过以下命令从shell调用它:
from tasks import test
test.delay('printme')
这很好。问题是,我想在多个环境中运行它,所以我想为每个环境指定一个单独的队列。我找到了queue_name_prefix
的文档,看起来像我想要的文档,但是我无法使其正常工作。
我尝试过的事情:
首先,我这样添加了一个config.py
文件:
broker_transport_options = {
'queue_name_prefix': 'dev-',
'region': 'us-east-1'
}
并运行celery -A tasks worker --loglevel=INFO --config=config
这会在aws上创建一个dev-celery
队列,但是当我尝试test.delay('printme')
时,它不会执行。
然后我注意到,如果我回去去跑芹菜而没有--config
标志,它就跑了我的测试任务。我检查并确认task_id
匹配,因此,即使我正在运行芹菜来从dev-celery
队列中 read 读取,我仍然 writing < / em>到celery
队列。
我还尝试使用app.conf.update
来更新代码中的celery应用,但似乎无法正常工作。
如何将预定的作业放在dev-celery
队列中?
答案 0 :(得分:0)
所以我确实做到了这一点,尽管我不知道这是否是最佳方法。问题似乎是,即使工作人员正在侦听“ dev-celery”队列,该任务仍被发送到默认的“ celery”队列。这是我最终使它起作用的方式:
在tasks.py
代码中,我向conf.update
添加了呼叫:
app = Celery('tasks')
app.config.update({
'broker_url': f'sqs://{aws_access}:{aws_secret}@',
'task_routes': {
'test': {'queue': 'dev-celery'}
}
})
,然后在将任务发送到队列时,使用apply_async
方法显式声明要使用的队列:
test.apply_async(
args=['print test'],
queue='dev-celery'
)
希望能对某人有所帮助;)