3个版本 (破坏性)

使用旧的Rust 2015

0.4.0 2016年3月29日
0.3.0 2016年3月13日
0.2.0 2016年3月13日

#1921 in 异步

每月 28 次下载

MIT 许可证

17KB
350

Tangle

Build Status

文档(主)

基于Scala的Futures在线程池中运行的Rust Future实现。它允许以与现有Rust构造良好协作的方式在异步并发中组合。

入门

使用Cargo安装tangle

[dependencies]
tangle = "0.4.0"

将crate添加到您的项目中

extern crate tangle;

并从这个crate中需要您需要的两种类型

use tangle::{Future, Async};

创建Future

使用值

创建Future的第一种方式是通过单元,或已解析的值。这不需要任何线程,并允许您将值提升到Future中,使其可组合。

Future::unit(1);
Future::unit("hello world".to_string());

无论是否涉及线程,Future值都必须实现Send特质。

使用闭包

您也可以通过使用闭包来创建Future。预期闭包将返回Async<T, E>类型,这是Result<T, E>的异步版本。

Future::new(move || {
  let result = // perform some heavy work here...

  Async::Ok(result);
});

使用通道

通道基本上是承诺的替代品。通常,承诺用于写入,而Future用于读取;然而,Tangle使用Rust通道替换了写入部分。

您可以允许Tangle创建通道,或者您可以使用::channel::from_channel分别自行传递接收器端。

let (tx, future) = Future::channel();

tx.send(123);

使用现有通道

use std::sync::mpsc::channel;

let (tx, rx) = channel();
let future = Future::from_channel(rx);

tx.send(123);

解析Future

目标是最终从Future中获得某种类型的值。您可以使用.recv()方法在Future上阻塞,或者使用and_then(平坦映射)和map链。后两种方法都是异步的,并继续在线程池中运行,它们自己也返回新的Future。

阻塞

let future = Future::unit(123);

// recv() returns `Result<T, E>`
assert_eq!(future.recv().unwrap(), 123);

and_then

您需要将值包装回Async类型。

let future = Future::unit(123);

future.and_then(move |n| {
  Async::Ok(n * 100)
});

您还可以使用Async::Continue动态组合Future。

let future = Future::unit(123);

future.and_then(move |n| {
  // ...
  Ok::Continue(find_user_id("thehydroimpulse"))
});

fn find_user_id(name: &str) -> Future<u64> {
  // ...
  return Async::Ok(...);
}

map

let future = Future::unit(123);

future.map(move |n| n * 100);

错误处理

TODO: 编写文档。

许可证

MIT许可证(MIT)版权所有(c)2016 Daniel Fagnan [email protected]

本授权协议授予任何获得本软件及其相关文档文件(统称“软件”)副本的个人免费使用该软件的权利,不受限制地处理该软件,包括但不限于使用、复制、修改、合并、发布、分发、再许可和/或销售软件副本,并允许向提供软件的个人进行此类操作,但须遵守以下条件

上述版权声明和本许可声明应包含在软件的所有副本或实质性部分中。

软件按“原样”提供,不提供任何形式的保证,无论是明示的还是暗示的,包括但不限于适销性、特定用途的适用性和非侵权性。在任何情况下,作者或版权所有者均不对任何索赔、损害或其他责任承担责任,无论该责任是基于合同、侵权或其他任何原因,是否与软件或软件的使用或其他方式有关。

依赖项

~140KB