Celery task未等待数据库更新,task_success信号无法获取最新记录
问题出现的核心原因
- 时序不匹配:你在
run_game任务中调用的channel_layer.group_send只是完成了消息投递动作,并不会等待Consumer端的save_result方法执行完毕。Channel Layer的消息消费是异步的,group_send返回仅代表消息已经进入消息队列,不代表消费逻辑(也就是save_to_db写入数据库的操作)已经执行完成。 - Celery的
task_success信号触发时机是任务函数run_gamereturn后立即执行,此时大部分情况下save_result还未被消费,数据库中还没有生成对应的Result记录,自然查询不到关联数据。 - 额外排查点:如果你的项目开启了默认自动提交外的事务配置,就算
save_to_db已经执行,只要事务未提交,task_success_handler所在的数据库会话也无法查询到未提交的写入数据。
常见修复方向
- 不要通过Channel Layer做任务内的数据库写入逻辑,直接把
Result写入操作放到run_game任务内同步执行,执行完成后再return,此时task_success触发时就可以查到写入结果。 - 如果必须通过Channel Layer执行写入,可以废弃
task_success信号的通知逻辑,将end.game通知逻辑放到Consumer的save_result方法末尾,等数据库写入完成后再触发。
内容的提问来源于stack exchange,提问作者user3199840
相关产品推荐
相关产品推荐

