import uuid
name = "poster_%s_%s.jpg" % (time.strftime("%Y%m%d_%H%M%S"), uuid.uuid4().hex[:8])
with open(path, "xb") as f:
    f.write(buf)

活动海报批量生成 200 张,最后目录里只有 173 个文件。日志里每个任务都返回 success,文件名格式是 poster_20261113_142233.jpg,同一秒内生成的都撞名。先别急着动参数,把报错原文和时间点记下来,顺序反了容易白折腾。

原因不复杂,文件名只精确到秒,并发 worker 在同一秒内落盘就会互相覆盖。写入用的是覆盖模式,后写的静默替换前一个,没有任何异常。任务返回成功只代表写完,不代表文件唯一。

「文件名重复覆盖」改完先别急着全量,挑一台机器放半天,真有问题这段时间就能看出来。备份不是备了就行,恢复一次才算数,很多备份文件打开才发现是空的。

处理上按这个顺序:文件名加上任务 id 或 uuid 后缀 保证唯一;写文件用独占创建模式 撞名直接报错而不是覆盖;落盘前检查目标是否存在 存在就重新生成名字;跑一次 200 张的全量任务 数一遍文件数。

改完只确认一件事:重跑 200 张任务后目录里正好 200 个文件,文件名没有重复,抽查十张内容各不相同。

作者 9823189