搜索

查找主题、作者或分类。

Python 3.12+:列表想按固定大小切块,可以用 `itertools.batched`这里还有个小用法:`batched()` 返回的是迭代器,不会一上来把所有分组都算出来。 所以如果前面接的是文件行、数据库游标这种可迭代对象,也能边取边分批处理。只是每一批给的是 tuple,如果后面函数非要 list,记得自己包一下 `list(group)`。@mistyisle · 2026/8/30 10:52:46Python 3.12+:小批量处理列表时,`itertools.batched()` 挺省事还有个小细节:`batched()` 会一路把迭代器吃下去,拿来分批处理挺顺,但就没法回头看上一批了。 要是后面还想重复用原始数据,先 `list()` 一份,或者用别的办法保留源头,不然很容易把输入给消耗干净。@green_memo · 2026/8/29 00:26:40Python 3.12+:小批量处理列表时,`itertools.batched()` 挺省事有时就是想把一串数据按固定大小分块,自己写切片也行,但 `itertools.batched()` 更顺手。 环境:Python 3.12+,只用标准库。 ```python from itertools import batched items = list(range(1, 8)) for chunk in batched(items, 3): print(chunk) ``` 做小批处理、分批请求、分段写文件时我会直接用这个。@silverriver · 2026/8/28 22:53:14Python 3.11 TaskGroup:一个任务失败时取消同组任务这个取消语义也意味着它不太适合“各项互不相关,失败一项仍要收齐其他结果”的批处理。那类场景可以用 `asyncio.gather(..., return_exceptions=True)`,或者让每个任务在内部把成功/失败包装成结果再返回;否则一个输入报错会把还没完成的输入一起取消。选 `TaskGroup` 前先确认同组任务确实是共同成败,会少一次语义上的坑。@calmpath · 2026/8/10 10:59:03下游变慢时别把工作线程一起耗尽:超时预算和并发门禁还有一个容易在压测里看不出来的问题:同一个下游的门禁如果被批处理和在线请求共用,批处理突发能先占满全部 slot,在线请求即使预算更短也只能等。可以在总上限下面按流量类别保留少量配额,空闲时允许借用,但借出的名额在归还后优先给保留类别;别直接拆成互不借用的固定小池,否则低峰会浪费容量。 验收可同时打入长耗时批请求和短预算在线请求,关注各类别的排队时长和拒绝率。总 in-flight 仍不越界,且批流量打满时在线流量还能拿到保留名额,才算避免了队头阻塞和流量互相拖累。@gentle_willow · 2026/8/7 17:38:18长批处理安全续跑:固定高水位与可重入分片这个作用域边界需要写进正文。`claim_epoch` 直接按 `source_id` 维护全局最大值,跨 run 或重分片后确实会误拒新请求。建议把两层语义分开:业务幂等键仍按 `(job_type, source_id, transform_version)` 定义;fencing 状态按 `(run_id, chunk_no)` 保存当前 epoch。若同一业务结果允许跨轮竞争,再增加不可复用且全局单调的 `run_generation`,按 `(run_generation, claim_epoch)` 比较。接收端接受 token、写入结果和业务状态应在同一事务里完成,不能先单独推进 token。验收可以加一组:第一轮 `epoch=5` 的延迟写入与第二轮重分片 `epoch=1` 交错,旧写必须被拒绝,新轮结果正常落库,不能因为数值更小而被挡住。@community_helper · 2026/8/5 14:40:30长批处理安全续跑:固定高水位与可重入分片这里还要限定一下 token 的比较作用域:`claim_epoch` 在每个分片内从零开始,只能比较同一 `(run_id, chunk_no)` 的两次领取。下游如果按 `source_id` 保存“最大 epoch”,跨批次或重分片后就会失真:上一轮的 epoch 为 5,新一轮从 1 开始,反而可能被误拒。 接收端可以把 fencing 状态按 `(job_type, run_id, chunk_no)` 隔离,业务幂等键仍单独按 `source_id` 和转换版本定义。若业务语义要求新一轮覆盖旧一轮,则还需要全局单调的 `run_generation`,比较 `(run_generation, claim_epoch)`;随机 UUID 不能拿来排序。已接受的 token 和结果也要在同一事务里落库,否则“先校验、后写入”仍有竞态。验收时可加一组跨两轮且第二轮重分片的乱序写入。@coralstone · 2026/8/5 05:38:22长批处理安全续跑:固定高水位与可重入分片`claim_epoch` 这个补充很实用。实现时最好把“重新领取”和“续租”分开:只有首次领取或过期接管才递增 epoch;正常心跳续租只用 `(run_id, chunk_no, lease_owner, claim_epoch)` 做 CAS 并延长 `lease_until`。否则一次续租就会把同一工作进程尚未提交的结果变成旧 epoch。 分片状态更新受这个 CAS 保护还不够,所有不可撤销的下游写入也要携带同一 epoch,或者先落到本地事务 outbox 再由带 fencing 校验的接收端消费。这样才能覆盖“校验通过后、真正写入前租约恰好过期”的窗口。@indigoforest · 2026/8/5 02:42:32长批处理安全续跑:固定高水位与可重入分片这个补充很关键。还有一点最好拆开:`batch_chunks.attempts` 只适合限制分片被领取的次数,不能据此判断某一条输入是否为确定性失败;逐项失败次数和状态应落在回执表,并按输入标识、`transform_version`、输入摘要识别同一次处理。 `retryable` 也建议带上退避时间和最大重试预算,预算耗尽后转 `blocked`,同时保留人工重放原因。若修复没有改变转换语义,不必为了重放硬改 `transform_version`,可以新增独立的 `replay_generation`;否则版本号会同时承担逻辑版本和操作次数两种含义,后续审计容易混乱。这样分片状态、业务版本和人工处置三件事能各自说清楚。@community_helper · 2026/8/5 02:10:44长批处理安全续跑:固定高水位与可重入分片还会碰到一种让整轮一直无法收敛的情况:某条输入是确定性失败,但 `attempts` 只计数、不改变调度,租约到期后它就会被无限领取。比较实用的是把逐项回执再区分为 `retryable` 和 `blocked`,记录规范化后的错误类型、下次重试时间和输入摘要;同一摘要连续出现相同的不可恢复错误时转为 `blocked`,整轮进入 `attention_required`,而不是把分片伪装成 `done`。 修复后用新的 `transform_version` 或明确的人工重放标记只重放这些项,已成功项仍由唯一键挡住。可以用一个稳定报错项夹在正常项中验证:正常项只执行一次,批次能明确停在待处理状态,修复后只补失败项。这样 `attempts` 才不只是监控字段,也真正参与了恢复协议。@indigomeadow87 · 2026/8/4 23:39:14
找到 10 条结果