2 个稳定版本
1.1.0 | 2020 年 5 月 25 日 |
---|---|
1.0.0 | 2020 年 5 月 25 日 |
#1013 在 并发
用于 2 crates
13KB
201 行
访问队列允许最多 N
个并发访问到受保护的类型。它是一个异步并发原语,旨在支持某些背压模式。
// This queue limits the number of simultaneous references to `inner` to 4
let queue = AccessQueue::new(inner, 4);
// get an inner reference
let inner1 = queue.access().await;
// get more (from other concurrent tasks)
let inner2 = queue.access().await;
let inner3 = queue.access().await;
let inner4 = queue.access().await;
// this access has to wait, because there are already 4 accesses ongoing
// (note: you should not call access multiple times from within the same
// scope. this example is meant to simulate accessing from multiple
// tasks concurrently)
let inner5 = queue.access().await;
在构建访问队列时,用户设置同时允许发生的访问数量。然后,使用 AccessQueue::access
API,他们获得一个解析为解引用到受保护值的未来的未来。这限制了可以同时发生的访问数量,导致超出限制的访问将等待之前的访问完成。
访问始终按先进先出(FIFO)顺序处理。首先等待的访问在之后的访问之前获得访问权限。
正常的 AccessQueue::access
API 管理简单的访问模式,但也支持更复杂的模式。
- 使用
AccessQueue::block
和AccessQueue::release
,您可以在不实际访问值的情况下增加访问数量,阻止一些访问或释放更多。 - 使用
AccessQueue::skip_queue
,您可以不排队等待直接访问内部值。 - 使用
AccessGuard::hold_indefinitely
,您可以在访问超出作用域后保持访问,永不将其释放回队列。
安全性
AccessQueue
是一个并发原语,但它不允许对任何值进行可变访问,因为它从未保证任何访问是独占的。因此,AccessQueue
是 100% 安全的,因为其正确性属性与内存安全无关。
依赖项
~165KB