4 个版本
0.2.0-alpha.1 | 2019 年 11 月 8 日 |
---|---|
0.1.2 | 2019 年 3 月 12 日 |
0.1.1 | 2019 年 3 月 8 日 |
0.1.0 | 2019 年 3 月 8 日 |
#1288 in 异步
201 每月下载量
14KB
118 行
async-lease
一个异步、原子性的选项类型,旨在与接受 self 的方法一起使用。
此模块提供了 Lease
类型,它类似于异步 Mutex
,但有一个主要区别:它期望您通过值移动租借的项,并在完成后返回它。您可以将 Lease
视为一个原子、异步的 Option
类型,在其中我们可以仅在没有人当前占用值时才 take
该值,并且当值返回时,我们会收到通知,以便我们可以尝试再次占用它。
此类型旨在与接受 self 的方法一起使用,并在将来某个时间点返回该 Self
以供未来使用。这在与未来相关的上下文中尤其常见。例如,考虑以下假设的非管道连接类型的以下方法
impl Connection {
fn get(self, key: i64) -> impl Future<Item = (i64, Self), Error = Error>;
}
假设你想公开一个接口,该接口不消耗 self
,而是有一个 poll_ready
方法来检查连接是否准备好接收另一个请求
impl MyConnection {
fn poll_ready(&mut self) -> Poll<(), Error = Error>;
fn call(&mut self, key: i64) -> impl Future<Item = i64, Error = Error>;
}
Lease
允许你这样做。具体来说,poll_ready
尝试使用 Lease::poll_acquire
获取租约,并将该租约 传输 到返回的未来。当未来最终解决时,我们 恢复 租借的值,以便 poll_ready
再次返回 Ready
给其他可能想要占用该值的人。上面的例子将如下所示
impl MyConnection {
fn poll_ready(&mut self) -> Poll<(), Error = Error> {
self.lease.poll_acquire()
}
fn call(&mut self, key: i64) -> impl Future<Item = i64, Error = Error> {
// We want to transfer the lease into the future
// and leave behind an unacquired lease.
let mut lease = self.lease.transfer();
lease.take().get(key).map(move |(v, connection)| {
// Give back the connection for other callers.
// After this, `poll_ready` may return `Ok(Ready)` again.
lease.restore(connection);
// And yield just the value.
v
})
}
}
依赖关系
~1MB
~17K SLoC