Python 批量回调全部处理最后一个任务:闭包晚绑定的复现与修复
批量注册三个导出任务,执行日志却出现三次同一个任务编号;回调数量正确,也没有异常。这时先检查回调如何绑定参数,再检查调度器是否重复投递。 本文使用进程内的零参数回调作为场景:注册阶段只保存函数,执行阶段才调用。示例不连接数据库、不访问网络,也不冒充真实生产事故。 现象:注册时正确,执行时全部变了 保存下面代码为 lat
Category
当前分类下的文章。
批量注册三个导出任务,执行日志却出现三次同一个任务编号;回调数量正确,也没有异常。这时先检查回调如何绑定参数,再检查调度器是否重复投递。 本文使用进程内的零参数回调作为场景:注册阶段只保存函数,执行阶段才调用。示例不连接数据库、不访问网络,也不冒充真实生产事故。 现象:注册时正确,执行时全部变了 保存下面代码为 lat
在项目目录运行脚本一切正常,交给定时任务后却报 FileNotFoundError。把配置文件再复制一份,错误消失了,程序却读到了旧配置。这两种现象往往来自同一个问题:程序把启动时的工作目录当成了配置文件所在目录。 本文用一个普通 Python 脚本演示取证、修复和回归测试。示例只读取本地文件,不依赖网络,不要求安装第
适用场景与现象 一个批处理服务用 EXPORT_ENABLED 控制是否生成导出文件。发布配置里已经写了 false,应用重启后却仍进入导出分支。开发环境不设置该变量时,功能又能正常关闭。 下面用这个场景复现问题。它适用于直接读取环境变量的 Python 程序;如果项目使用配置框架,应先查明框架自己的布尔解析规则,避免
适用场景与异常表现 离线任务跑了 26 小时,报表却显示只耗时 2 小时;开始、结束时间颠倒了 1 秒,监控却出现接近 24 小时的长任务;耗时 250 毫秒的接口被统计为 0 秒。这三种现象可能来自同一行代码: duration_seconds = (finished_at - started_at).seconds
配置导入接口返回成功,回读结果却与提交内容不一致。先检查客户端发出的原始 JSON:同一个对象里可能出现了两次 quota,而解析器只留下了后一个值。等数据变成字典,再严格的字段校验也找不回被覆盖的那一项。 本文以“批量任务额度配置”为例,把排查推进到解析入口,并提供可以独立运行的实现与回归测试。示例使用 Python
服务还在使用 Python 3.13,开发机已经安装 3.14,3.15 又发布了。真正需要判断的是:哪些功能能解决项目里的问题,哪些行为变化会让原来的代码失败,以及如何验证升级没有改变业务结果。 本文以 2026 年 10 月 17 日为时间点,比较三个版本的主要变化。Python 3.13 于 2024 年 10
一个报表接口连续执行两次:第一次查询订单,第二次查询库存。库存请求却带上了订单请求追加的字段。重启进程后暂时恢复,压测时又复现。数据库查询本身没有问题,污染发生在构造查询参数之前。 这类故障不一定需要并发:同一进程中两个顺序调用就能触发。本文用纯 Python 标准库复现并修复,适用于长期运行的 Web 服务、任务 W
库存调整 CSV 看起来有三列,导入后却只剩两个字段;另一份文件的 sku 明明存在,程序却报 KeyError。这类问题先查文件边界,别急着给字典取值加默认值。默认值会把格式错误变成库存错误。 本文约定一个具体接口:上传 UTF-8 的 CSV,列为 sku,quantity,note,SKU 只能包含大写字母、数字
场景:计算结果没报错,核对总额却对不上 订单预览、费用计算和导出报表里,容易出现两种相似的现象:2.675 保留两位变成 2.67;两条 0.335 的明细分别显示 0.34,总计却显示 0.67。前者可能是输入已经经过二进制浮点数,后者可能是逐行舍入与汇总舍入的口径不同。只把所有变量换成 Decimal,解决不了第二
适用场景与现象 适用于 Python 3.10 及以上的命令行程序、后台任务和自有服务。业务代码只调用一次 logger.info(),同一进程的原始输出却出现两行;或者应用工厂每执行一次,同一事件就多输出一遍。 先分清重复发生在哪一层:若进程的 stderr 只有一条,而日志平台出现两条,优先检查采集路径是否同时包含