2 个稳定版本

1.1.0 2020 年 5 月 25 日
1.0.0 2020 年 5 月 25 日

#1013并发


用于 2 crates

MIT/Apache

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::blockAccessQueue::release,您可以在不实际访问值的情况下增加访问数量,阻止一些访问或释放更多。
  • 使用 AccessQueue::skip_queue,您可以不排队等待直接访问内部值。
  • 使用 AccessGuard::hold_indefinitely,您可以在访问超出作用域后保持访问,永不将其释放回队列。

安全性

AccessQueue 是一个并发原语,但它不允许对任何值进行可变访问,因为它从未保证任何访问是独占的。因此,AccessQueue 是 100% 安全的,因为其正确性属性与内存安全无关。

依赖项

~165KB