#waker #async #await

waitlist

跟踪要唤醒的有序列表

2个版本

0.1.1 2023年2月6日
0.1.0 2020年2月18日

#1097 in 异步

Download history 106/week @ 2024-03-13 94/week @ 2024-03-20 110/week @ 2024-03-27 104/week @ 2024-04-03 79/week @ 2024-04-10 94/week @ 2024-04-17 56/week @ 2024-04-24 24/week @ 2024-05-01 29/week @ 2024-05-08 35/week @ 2024-05-15 15/week @ 2024-05-22 31/week @ 2024-05-29 45/week @ 2024-06-05 41/week @ 2024-06-12 38/week @ 2024-06-19 40/week @ 2024-06-26

170 每月下载

Apache-2.0

16KB
284

Coverage Status Build Status

Waitlist

在Rust异步编程中,跟踪一组应在事件发生时被通知的 Waker 是相当常见的。这对于实现许多同步抽象,包括互斥锁、通道、条件变量等非常有用。此库提供了一个 Waker 队列的实现,可用于此目的。

致谢

该实现(和API)大量借鉴了 waker_set 模块,该模块来自 async-std,而存储结构则受到了 slab 的启发,尽管实际细节有所不同,以优化 WaitList 的使用。

async-stdfutures-util 的区别

此实现与 waker_set 实现和 futures-util 包中遵循的模式有所不同。具体来说

  1. 任务被通知的顺序更加公平。 Waitlist 使用FIFO队列来通知等待的任务,而其他实现中 slab 的使用可能导致在某些情况下任务饥饿(参见 https://users.rust-lang.org/t/concerns-about-using-slab-to-track-wakers/33653)。
  2. 从列表中删除条目可能是 O(n) 而不是 O(1)。这是一个权衡。使用slab由于它不关心条目的顺序,因此删除操作是 O(1)。另一方面,使用 Waitlist 通知单个条目是 O(1),而通知所有等待的任务只需要遍历等待条目,而使用slab则需要遍历整个slab的容量。此外,如果条目已在 Waitlist 中唤醒,"删除"操作仍然是 O(1)(因为它实际上只是减少计数器)。
  3. WaitList 使用 std::sync::Mutex 进行同步,类似于 futures-util,而不像 async-std,它使用 Mutex

无运行时依赖