#async #lease #mutex

async-lease

本质上是一个面向 futures 的 Arc>>。

4 个版本

0.2.0-alpha.12019 年 11 月 8 日
0.1.2 2019 年 3 月 12 日
0.1.1 2019 年 3 月 8 日
0.1.0 2019 年 3 月 8 日

#1288 in 异步

Download history 5/week @ 2023-11-09 10/week @ 2023-11-16 9/week @ 2023-11-23 17/week @ 2023-11-30 3/week @ 2023-12-07 8/week @ 2023-12-14 12/week @ 2023-12-21 6/week @ 2023-12-28 3/week @ 2024-01-04 4/week @ 2024-01-11 7/week @ 2024-01-18 12/week @ 2024-01-25 9/week @ 2024-02-01 13/week @ 2024-02-08 62/week @ 2024-02-15 116/week @ 2024-02-22

201 每月下载量

MIT 许可协议

14KB
118

async-lease

Crates.io Documentation Build Status Codecov

一个异步、原子性的选项类型,旨在与接受 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