2个版本
| 0.1.1 | 2023年2月6日 |
|---|---|
| 0.1.0 | 2020年2月18日 |
#1097 in 异步
170 每月下载
16KB
284 行
Waitlist
在Rust异步编程中,跟踪一组应在事件发生时被通知的 Waker 是相当常见的。这对于实现许多同步抽象,包括互斥锁、通道、条件变量等非常有用。此库提供了一个 Waker 队列的实现,可用于此目的。
致谢
该实现(和API)大量借鉴了 waker_set 模块,该模块来自 async-std,而存储结构则受到了 slab 的启发,尽管实际细节有所不同,以优化 WaitList 的使用。
与 async-std 和 futures-util 的区别
此实现与 waker_set 实现和 futures-util 包中遵循的模式有所不同。具体来说
- 任务被通知的顺序更加公平。
Waitlist使用FIFO队列来通知等待的任务,而其他实现中slab的使用可能导致在某些情况下任务饥饿(参见 https://users.rust-lang.org/t/concerns-about-using-slab-to-track-wakers/33653)。 - 从列表中删除条目可能是
O(n)而不是O(1)。这是一个权衡。使用slab由于它不关心条目的顺序,因此删除操作是O(1)。另一方面,使用Waitlist通知单个条目是O(1),而通知所有等待的任务只需要遍历等待条目,而使用slab则需要遍历整个slab的容量。此外,如果条目已在Waitlist中唤醒,"删除"操作仍然是O(1)(因为它实际上只是减少计数器)。 WaitList使用 std::sync::Mutex 进行同步,类似于futures-util,而不像async-std,它使用Mutex。