#thread #cancel #future #utilities #tokio

wombo

事件循环线程管理工具

3个版本

使用旧Rust 2015

0.1.2 2018年1月27日
0.1.1 2018年1月27日
0.1.0 2018年1月19日

异步中排名1578

Download history 135/week @ 2023-11-30 189/week @ 2023-12-07 40/week @ 2023-12-14 15/week @ 2023-12-21 38/week @ 2024-01-04 167/week @ 2024-01-11 275/week @ 2024-01-18 249/week @ 2024-01-25 229/week @ 2024-02-01 302/week @ 2024-02-08 245/week @ 2024-02-15 166/week @ 2024-02-22 185/week @ 2024-02-29 406/week @ 2024-03-07 548/week @ 2024-03-14

每月下载量1,326

MIT许可协议

27KB
600

Wombo

Build Status Crates.io

文档

事件循环线程管理工具。

安装

使用 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