返回首页
最新
我一直在开发一个 Python 异步库([Blazeio](https://github.com/anonyxbiz/Blazeio)),并偶然发现了一种令人震惊的简单优化,使得 `asyncio.Event` 看起来像是一个过时的产物。
### *问题*
`asyncio.Event`(以及其他语言中的类似结构)存在两个严重的扩展缺陷:
1. *内存*:它为每个等待者分配<i>一个未来对象</i> → 1M 等待者 = 浪费 48MB 内存。
2. *延迟*:它以<i>逐个唤醒</i>的方式唤醒等待者 - 在全局解释器锁(GIL)下的系统调用复杂度为 O(N)。
### *解决方案:`SharpEvent`*
一个可直接替换的方案:
- *为所有等待者使用一个共享的未来对象* - *O(1) 内存*。
- *在单个操作中唤醒所有等待者* - *O(1) 延迟*。
### *基准测试*
| 指标 | `asyncio.Event` | `SharpEvent` |
|--------------|-----------------|--------------|
| 1K 等待者 | ~1ms 唤醒 | *~1µs* |
| 1M 等待者 | *崩溃* | *仍然 ~1µs* |
| 内存 (1M) | 48MB | *48 字节* |
### *为什么这很重要*
- *实时应用*(WebSockets、游戏)获得了*可预测的延迟*。
- *高并发*(物联网、交易)变得简单。
- 它是*纯 Python*,但性能超过了 CPython 的 C 实现。
### *没有缺点?*
几乎没有。如果你需要每个等待者的超时/取消功能,你需要一个包装器,但 99% 的使用场景只需要批量唤醒。
### *试试吧*
```python
from Blazeio import SharpEvent
event = SharpEvent()
event.set() # 立即唤醒所有等待者
```
[GitHub](https://github.com/anonyxbiz/Blazeio)
<i>欢迎反馈,我是否遗漏了关键的使用场景?</i>
我最近建立了一个开源的Nix项目,想与r/NixOS的朋友们分享。<p>我在2023年注册了一个账户,但我并不常用,而且之前选择的用户名我也不太喜欢,所以我创建了一个新账户,并将项目发布到r/NixOS,但我的帖子立刻被删除,账户也被阴影禁言。我又创建了几个账户,结果在发布后都被阴影禁言。<p>后来我了解到,大多数子版块要求用户在被认为可信之前必须拥有一定的声望,这可以理解,但不显示声望要求而直接删除帖子并进行阴影禁言的做法实在太过敌对。<p>我尝试用新账户进行申诉,但两个月后仍未得到回应,禁言也没有解除。<p>后来我开始重新使用我的2023年账户,这次我注意到了声望。我主要只是评论,并在一些不需要高声望的子版块发了一两条帖子。其中一条帖子获得了很多赞和回复,给我带来了24点帖子声望,我认为这足以证明我不是个垃圾信息发布者。因此,我在r/macapps上发了一条帖子,发布我最近开发的Mac应用。帖子也立刻被删除,但我的账户没有被阴影禁言。后来,我惊讶地发现帖子被恢复了,并开始收到其他Reddit用户的回复。一位Reddit用户私信我说她是一名学生,觉得我的应用很有用,问我是否有折扣码。我回复说因为她是第一个问的人,我就给她一个免费版。但就在我发送兑换码后,我的账户又一次被阴影禁言了。我最后一条希望她能留下评论的消息无法发送给她。<p>那一刻对我来说真是太糟糕了。<p>我昨天立刻尝试申诉,今天发现我甚至无法登录账户,系统提示我的用户名和密码无效。重置密码也没有用。<p>现在Reddit对新用户来说是个活地狱吗?我想知道其他人是否有类似的经历?