2 个版本
0.1.1 | 2019 年 7 月 4 日 |
---|---|
0.1.0 | 2019 年 6 月 24 日 |
#2079 in 异步
10KB
218 行
tokio-blocking
在 futures 的上下文中,通过一个薄薄的包装来提供一个简单的接口,以在非阻塞操作之间插入阻塞操作。
let mut runtime = Runtime::new().unwrap();
let pool = ThreadPool::new(4);
let task = lazy(|| Ok::<_, ()>(3))
.and_then(|_| {
// Normal non-blocking operations
Ok(())
})
.and_then_block(pool, move |_| {
// Allow blocking operation, which doesn't actually block other futures
std::thread::sleep(std::time::Duration::from_secs(3));
Ok(10)
})
.and_then(|_| {
// Normal non-blocking operation
Ok(())
});
runtime.block_on(task).unwrap();
这个 crate 的诞生是因为现有的 blocking
- 需要大量的模板代码。
- 在所有操作完成后阻塞整个任务(例如,
select
不工作得很好)。
组合器
支持以下组合器。所有这些组合器都接受两个参数:一个是负责阻塞操作的线程池句柄,另一个是在阻塞操作完成后要调用的回调。回调的返回值类型为 Result
。它被传递给后续的组合器(如 and_then
)。
and_then_block
or_else_block
then_block
依赖项
~4.5MB
~68K SLoC