You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Celery task未等待数据库更新,task_success信号无法获取最新记录

问题出现的核心原因

  • 时序不匹配:你在run_game任务中调用的channel_layer.group_send只是完成了消息投递动作,并不会等待Consumer端的save_result方法执行完毕。Channel Layer的消息消费是异步的,group_send返回仅代表消息已经进入消息队列,不代表消费逻辑(也就是save_to_db写入数据库的操作)已经执行完成。
  • Celery的task_success信号触发时机是任务函数run_game return后立即执行,此时大部分情况下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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.19 12:27:02