3个版本
使用旧Rust 2015
0.1.2 | 2018年1月27日 |
---|---|
0.1.1 | 2018年1月27日 |
0.1.0 | 2018年1月19日 |
在异步中排名1578
每月下载量1,326
27KB
600 行
Wombo
事件循环线程管理工具。
安装
使用 cargo edit。
cargo add wombo
特性
- 减少生成事件循环线程的样板代码。
- 取消事件循环,并提供在事件循环上清理资源的接口。
- 当事件循环线程退出时接收通知,可以携带任意数据。
用法
生成一个等待一秒的事件循环线程,并在50毫秒后条件性地中断它,将一些数据返回到主线程。
extern crate futures;
extern crate wombo;
extern crate tokio_timer;
use futures::Future;
use tokio_timer::Timer;
use std::thread;
use std::time::Duration;
use wombo::*;
const SHOULD_INTERRUPT: bool = true;
fn main() {
// expected value when not interrupted
let foo = 1;
// expected value when interrupted
let bar = 2;
let timer = Timer::default();
let sleep_dur = Duration::from_millis(50);
let wombo = Wombo::new();
let options = ThreadOptions::new("loop-1", None);
let spawn_result = wombo.spawn(options, move |handle, hooks| {
// sleep for a second, then return foo, or if canceled return bar
let dur = Duration::from_millis(1000);
hooks.on_cancel(move || Ok(bar));
timer.sleep(dur)
.map_err(|_| ())
.and_then(move |_| Ok(foo))
});
if let Err(e) = spawn_result {
panic!("Error spawning event loop thread: {:?}", e);
}
// give the child thread a chance to initialize
thread::sleep(sleep_dur);
assert!(wombo.is_running());
println!("Wombo {} running thread {:?}", wombo.id(), wombo.core_thread_id());
if SHOULD_INTERRUPT {
if let Err(e) = wombo.cancel() {
panic!("Error canceling: {:?}", e);
}
}
let result = match wombo.on_exit() {
Ok(rx) => rx.wait().unwrap(),
Err(e) => panic!("Error calling on_exit: {:?}", e)
};
if SHOULD_INTERRUPT {
assert_eq!(result, Some(bar));
}else{
assert_eq!(result, Some(foo));
}
}
更多示例请参阅 示例。
测试
运行测试
cargo test
依赖
~10MB
~178K SLoC