#operations #blocking #future #non-blocking #interface #context #wrapper

tokio-blocking

在 futures 的上下文中,通过一个薄薄的包装来提供一个简单的接口,以在非阻塞操作之间插入阻塞操作。

2 个版本

0.1.1 2019 年 7 月 4 日
0.1.0 2019 年 6 月 24 日

#2079 in 异步

MIT 许可证

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

  1. 需要大量的模板代码。
  2. 在所有操作完成后阻塞整个任务(例如,select 不工作得很好)。

组合器

支持以下组合器。所有这些组合器都接受两个参数:一个是负责阻塞操作的线程池句柄,另一个是在阻塞操作完成后要调用的回调。回调的返回值类型为 Result。它被传递给后续的组合器(如 and_then)。

  1. and_then_block
  2. or_else_block
  3. then_block

依赖项

~4.5MB
~68K SLoC