当稳定性提升性能时(线程)
Source: Dev.to
请提供您希望翻译的正文内容,我将为您翻译成简体中文并保持原有的格式。
TokenGate 概述
TokenGate 是一个基于 token 管理的并发系统。被装饰的函数返回 tokens 而不是立即执行。Tokens 通过包装的装饰器被接收,按权重类路由到每个核心的邮箱,并在线程池工作者上执行。
该系统将 async coordination 与 threaded execution 分离:
- 异步事件循环负责 token 的路由和协调。
- 线程池负责实际执行。
权重分类与核心分配
每个任务被分配一个权重,用于决定它可以运行的核心范围:
| 权重 | 核心范围 |
|---|---|
| HEAVY | 所有核心 |
| MEDIUM | Core 2 + |
| LIGHT | Core 3 + |
在一个范围内,交错位置计数器会按 FIFO 顺序在工作线程之间分配令牌,允许交错的重试令牌。
粘性令牌
共享相同 (operation_type, args) 键的令牌会被 固定 在首次接收它们的核心上,以保持数据局部性。当令牌到达时,sticky_registry.mark() 会创建一个粘性锚点,自动将相关部分分组。
@task_token_guard(
operation_type="my_op",
tags={"weight": "medium", "sticky_anchor": "my_domain"},
)
def my_operation(n: int) -> int:
...
主动域锚定
第二层主动层在任何子令牌被路由之前,将整个调用链锚定到一个域。这确保所有相关数据在同一个核心上解释。
当主令牌被装饰为 external_calls 时,会生成一个 SHA‑256 种子:
seed = SHA256(token_id + ":" + freeze(external_calls))
64 字符的十六进制摘要将种子固定在主令牌落入的核心上。所有生成的子令牌继承该种子,从而在同一核心上执行。
@task_token_guard(
operation_type="lead_op",
tags={"weight": "medium", "external_calls": ["child_op"]},
)
def lead_operation(n: int) -> list:
# Children inherit the seed and land on the same core
return [child_op(n + i) for i in range(4)]
待处理的主操作计数在创建时因每个外部调用而递增,完成后递减。当计数降至零时,种子被释放。
性能结果
基准测试运行了 15 次加倍波,累计处理 131,068 个 token。下表显示了每波的每秒 token 数、平均延迟和重叠因子。
| Wave | Tokens | Tok/s | Lat (ms) | Overlap |
|---|---|---|---|---|
| 1 | 4 | 1386.2 | 0.721 | 1.44× |
| 2 | 8 | 2391.2 | 0.418 | 2.48× |
| 3 | 16 | 2744.8 | 0.364 | 4.82× |
| 4 | 32 | 2812.7 | 0.356 | 11.32× |
| 5 | 64 | 2880.0 | 0.347 | 22.01× |
| 6 | 128 | 2907.6 | 0.344 | 29.78× |
| 7 | 256 | 2846.8 | 0.351 | 37.98× |
| 8 | 512 | 2811.5 | 0.356 | 41.81× |
| 9 | 1024 | 2813.9 | 0.355 | 44.18× |
| 10 | 2048 | 2644.3 | 0.378 | 44.86× (peak) |
| 11 | 4096 | 2816.3 | 0.355 | 38.34× |
| 12 | 8192 | 2819.9 | 0.355 | 32.64× |
| 13 | 16384 | 2765.0 | 0.362 | 27.92× (sustained) |
| 14 | 32768 | 2707.7 | 0.369 | 24.96× |
| 15 | 65536 | 2789.5 | 0.358 | 24.21× |
Zero failures. Average latency: 0.386 ms/token.
之前的路由方式在饱和后将重叠度限制在约 17×,受跨域流量的限制。域锚定消除了这种浪费:属于同一组的 token 会保持在一起,保持缓存行热度并降低跨核流量。因此,重叠上限提升,且即使重叠超过 20×,延迟仍保持平稳。
参与方式
如果您运行并发的 Python 工作负载——任务队列、异步流水线,或任何当前自由路由的相关操作系统——欢迎尝试 TokenGate 并分享您的观察。
- 粘性注册表和哈希指挥者为可选功能;现有代码仍按常规路由。
- 哈希域锚定和粘性令牌计划作为首批“生产就绪”特性。
感兴趣的场景
- 没有明显原因的意外并发上限。
- 数据局部性可能提升性能的高吞吐量流水线。
代码仓库是公开的,欢迎提交 issue 和观察报告:
TokenGate 已累计近 4,000 小时的业余开发。随着项目向商业化方向推进,社区的反馈将不胜感激。