17 个版本

0.1.16 2024年7月12日
0.1.10 2023年4月12日
0.1.9 2023年1月30日
0.1.7 2022年9月19日
0.1.0 2018年5月10日

#277 in 并发

Download history 4/week @ 2024-04-28 5/week @ 2024-05-19 4/week @ 2024-06-16 276/week @ 2024-06-30 373/week @ 2024-07-07 30/week @ 2024-07-14 14/week @ 2024-07-28

每月 65 次下载
用于 may_rpc

MIT/Apache

23KB
493

Build Status Current Crates.io Version Document

协程等待库

此库提供了一个关联的阻塞原语,用于等待另一个协程生成的响应

使用方法

  • 关联的映射接口通过 WaiterMap 实现
fn test_waiter_map() {
    let req_map = Arc::new(WaiterMap::<usize, usize>::new());
    let req_map_1 = req_map.clone();

    let key = 1234;

    // one coroutine wait data send from another coroutine
    // prepare the waiter first
    let waiter = req_map.new_waiter(key);

    // trigger the rsp in another coroutine
    go!(move || req_map_1.set_rsp(&key, 100).ok());

    // this will block until the rsp was set
    let result = waiter.wait_rsp(None).unwrap();
    assert_eq!(result, 100);
}
  • 关联的令牌接口通过 TokenWaiter 实现,不需要映射
fn test_token_waiter() {
    for j in 0..100 {
        let result = go!(move || {
            let waiter = TokenWaiter::<usize>::new();
            let waiter = Pin::new(&waiter);
            let id = waiter.id().unwrap();
            // trigger the rsp in another coroutine
            go!(move || TokenWaiter::set_rsp(id, j + 100));
            // this will block until the rsp was set
            assert_eq!(waiter.wait_rsp(None).unwrap(), j + 100);
            // after wait we can get the id again
            let id = waiter.id().unwrap();
            go!(move || TokenWaiter::set_rsp(id, j));
            waiter.wait_rsp(std::time::Duration::from_secs(2)).unwrap()
        })
        .join()
        .unwrap();

        assert_eq!(result, j);
    }
}

依赖项

~4–30MB
~443K SLoC