启动Celeryworker正常但异步任务未执行,通常因任务定义在非默认队列而worker仅监听默认队列(默认队列名为celery)。启动时使用-Q参数指定对应的任务队列,或让一个worker同时监听多个队列即可解决。
在Django项目里配置好Celery后,执行以下命令启动worker:
celery -A xxx worker -l info -P solo
启动日志看起来一切正常,终端也显示worker已经就绪。但当你调用异步任务(比如用delay())时,奇怪的事情发生了——任务似乎没有执行,控制台里没有任何输出信息。
长期稳定更新的攒劲资源: >>>点此立即查看<<<


此时不必急于怀疑代码错误,可以先检查settings.py中的配置。很可能是因为配置了多个队列,而异步任务被分配到了非默认的队列中。例如,下面的截图展示了定义多个队列的情况:

而当前启动的worker默认只监听celery这个队列。如果任务定义在production或其他队列中,那么任务就不会被触发执行。

找到问题后,解决方法很简单:在启动worker时明确指定要监听的队列:
celery -A xxx worker -l info -P solo -Q production
运行后,任务就能正常执行了:

此外,也可以让一个worker同时处理多个队列,只需用逗号分隔队列名:
celery -A xxx worker -l info -P solo -Q production,celery
启动日志会显示该worker正在监听这两个队列:

遇到Celery worker启动正常但任务不执行的情况,先确认异步任务定义在哪个队列中,然后在启动worker时使用-Q参数指定对应的队列。如果项目中使用多个队列,可以分别启动不同的worker,或让一个worker同时监听多个队列。掌握这个排查思路,能有效节省调试时间。
侠游戏发布此文仅为了传递信息,不代表侠游戏网站认同其观点或证实其描述