#future #callback #async #completablefuture

future_handles

一个用于通过句柄完成未来的库

3个不稳定版本

0.2.0 2022年2月6日
0.1.1 2022年2月6日
0.1.0 2022年2月5日

#1157 in 异步

LGPL-3.0-only

26KB
325

Future Handles

一个通过远程句柄完成未来的Rust库。

async fn func() -> Option<u32> {
     let (future, handle) = unsync::create();

     func_with_callback(|| {
         handle.complete(1);
     });

     match future.await {
         // The callback was invoked and the result set via the handle.
         Ok(res) => Some(res),
         // The callback was never invoked, but the handle has been dropped.
         Err(_) => None
     }
}

lib.rs:

概述

一个通过远程句柄完成未来的crate。

尽管它的设计不应该限制 future_handles 的使用场景,但这个crate最初是为了在异步函数与Rust的async/await范式竞争时架起桥梁而构思的。

功能

  • 单线程环境无锁定开销。
  • 可选的线程安全与自旋锁。
  • 如果句柄被丢弃,未来始终以错误完成。
  • 既支持通道式API也支持作用域API。

示例

通道式API

async fn func() -> Option<u32> {
    let (future, handle) = unsync::create();

    func_with_callback(|res| {
        handle.complete(res);
    });

    future.await.ok()
}

作用域API

async fn func() -> Option<u32> {
    let future = unsync::scoped(|handle| {
        func_with_callback(|res| {
            handle.complete(res);
        });
    });

    future.await.ok()
}

线程安全

此crate默认提供了一个非线程安全的 unsync 实现。要使 sync 线程安全实现可用,请启用 sync 功能。

危险!

不要这样做!

async fn func() {
    let (future, handle) = unsync::create();

    // Start awaiting here...
    future.await.unwrap();
    // Now we'll never be able set the result!
    handle.complete(1);
}

在设置结果或丢弃相关 CompleteHandle 之前等待 CompletableFuture 将导致 死锁

依赖项

~1–1.6MB
~34K SLoC