使用Celery apply_async()时Worker不消费任务的问题排查
问题原因
你用apply_async(queue="queue")把任务发送到了名为queue的自定义队列,但启动Worker时没指定要消费这个队列——默认情况下Celery Worker只会监听默认队列(通常是celery),所以delay()能正常消费(因为它默认使用默认队列),而指定了自定义队列的任务会被留在队列里无人处理。
解决方法
有两种方式可以解决这个问题:
方式1:启动Worker时指定要监听的队列
修改启动命令,加上-Q参数指定要消费的队列:
celery -A some_task worker --loglevel=INFO --without-gossip -Q queue
如果需要同时监听默认队列和自定义队列,用逗号分隔多个队列:
celery -A some_task worker --loglevel=INFO --without-gossip -Q celery,queue
方式2:给任务配置默认队列(可选)
如果希望这个任务默认就发送到queue队列,不用每次调用都指定,可以在定义任务时设置:
@app.task(queue="queue") def print_hi(): print("hi")
之后不管用delay()还是apply_async(),任务都会进入queue队列,但仍需确保Worker启动时监听这个队列。
内容的提问来源于stack exchange,提问作者Anthraxff
相关产品推荐
相关产品推荐

