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 并发
每月 65 次下载
用于 may_rpc
23KB
493 行
协程等待库
此库提供了一个关联的阻塞原语,用于等待另一个协程生成的响应
使用方法
- 关联的映射接口通过
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