3个不稳定版本
0.2.0 | 2022年2月6日 |
---|---|
0.1.1 | 2022年2月6日 |
0.1.0 | 2022年2月5日 |
#1157 in 异步
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