Category

开发

当前分类下的文章。

开发 58 阅读

Python 3.13、3.14、3.15 有什么区别:新功能、示例与升级检查

服务还在使用 Python 3.13,开发机已经安装 3.14,3.15 又发布了。真正需要判断的是:哪些功能能解决项目里的问题,哪些行为变化会让原来的代码失败,以及如何验证升级没有改变业务结果。 本文以 2026 年 10 月 17 日为时间点,比较三个版本的主要变化。Python 3.13 于 2024 年 10

阅读全文
开发 76 阅读

Python 请求参数串数据:可变默认值与浅拷贝的定位和修复

一个报表接口连续执行两次:第一次查询订单,第二次查询库存。库存请求却带上了订单请求追加的字段。重启进程后暂时恢复,压测时又复现。数据库查询本身没有问题,污染发生在构造查询参数之前。 这类故障不一定需要并发:同一进程中两个顺序调用就能触发。本文用纯 Python 标准库复现并修复,适用于长期运行的 Web 服务、任务 W

阅读全文
开发 116 阅读

Python CSV 导入静默丢列:重复表头、BOM 与行宽异常的定位和修复

库存调整 CSV 看起来有三列,导入后却只剩两个字段;另一份文件的 sku 明明存在,程序却报 KeyError。这类问题先查文件边界,别急着给字典取值加默认值。默认值会把格式错误变成库存错误。 本文约定一个具体接口:上传 UTF-8 的 CSV,列为 sku,quantity,note,SKU 只能包含大写字母、数字

阅读全文
开发 164 阅读

Python 金额差一分钱:从 float 输入污染到 Decimal 舍入边界

场景:计算结果没报错,核对总额却对不上 订单预览、费用计算和导出报表里,容易出现两种相似的现象:2.675 保留两位变成 2.67;两条 0.335 的明细分别显示 0.34,总计却显示 0.67。前者可能是输入已经经过二进制浮点数,后者可能是逐行舍入与汇总舍入的口径不同。只把所有变量换成 Decimal,解决不了第二

阅读全文
开发 199 阅读

Python 日志一条变两条:从 handler 重复注册到传播链修复

适用场景与现象 适用于 Python 3.10 及以上的命令行程序、后台任务和自有服务。业务代码只调用一次 logger.info(),同一进程的原始输出却出现两行;或者应用工厂每执行一次,同一事件就多输出一遍。 先分清重复发生在哪一层:若进程的 stderr 只有一条,而日志平台出现两条,优先检查采集路径是否同时包含

阅读全文
开发 212 阅读

Python 调用遗留命令乱码又卡死:字节解码、超时与安全参数实践

适用场景 本文适用于 Python 3.11 及以上版本。业务程序需要调用数据库备份工具、硬件厂商 CLI、Windows 遗留程序或内部运维命令,但这些程序的输出编码不是 UTF-8,并且可能出现长时间无响应、非零退出、输出管道堵塞或参数注入风险。 目标不是再封装一层 subprocess.run(),而是建立一个可

阅读全文
开发 280 阅读

Go OAuth 令牌过期瞬间请求雪崩:用 singleflight 合并刷新并隔离超时

调用第三方 API 的 Go 服务通常会在内存中缓存 OAuth 访问令牌,并在令牌即将过期时刷新。单实例、低并发时,这段逻辑看起来很简单;并发升高后,几十个请求可能同时发现令牌失效,又同时访问认证端点。结果不是更快拿到新令牌,而是认证服务返回 429 Too Many Requests,业务请求批量失败,甚至出现“较

阅读全文
开发 401 阅读

Django 新订单偶发查询不到:Celery 任务早于事务提交的排查与修复

Django 新订单偶发“查询不到”:Celery 任务早于事务提交的排查与修复 适用场景与现象 下单接口先写入订单,再让 Celery Worker 发送确认邮件。接口返回成功,Worker 却偶发 Order.DoesNotExist;在管理后台查询,同一订单已经存在。失败多发生在数据库写入较慢、Worker 较空

阅读全文
开发 408 阅读

Go 配置热更新偶发数据竞争:用不可变快照与 atomic.Pointer 安全切换

配置热更新看起来只是“重新读一次文件”,但在高并发服务里,它实际上是一次共享状态切换。如果更新协程直接修改正在被请求协程读取的 map、切片或结构体字段,轻则读到新旧配置拼接出的混合状态,重则触发 concurrent map read and map write,让整个进程退出。 本文以一个会动态调整上游地址和超时时

阅读全文
开发 464 阅读

TypeScript 请求已超时却仍占用连接:用 AbortController 建立可取消的重试边界

适用场景 本文适用于 Node.js 20.3 及以上版本使用原生 fetch 调用内部 API、第三方服务或网关的 TypeScript 项目。示例使用该版本提供的 AbortSignal.any();更早版本可以用等价的信号组合函数替代。典型现象是:业务层已经返回“请求超时”,但下游仍持续收到请求;并发升高后连接数

阅读全文