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
。