2个版本
0.1.1 | 2020年2月12日 |
---|---|
0.1.0 | 2020年2月12日 |
#1624 in 异步
26KB
309 行
local-pool-with-id
对LocalPool执行器的一个小变体,它公开唯一的ID以跟踪未来的完成。
这几乎可以作为一个现有的LocalPool的直接替换。所有现有的特性仍然被实现。有两个API差异
- 实现了新的
(Local)SpawnWithId
特性。这些接受与非ID版本相同的参数,但返回一个唯一的ID,可用于识别启动的未来是否已完成。 try_run_one
现在返回一个Option<usize>
而不是布尔值。这个usize将对应于从之前的API接收到的ID,可以与外部跟踪机制一起使用,以确定未来是否完成。
动机
现有的LocalPool
允许您以非阻塞方式或以阻塞方式运行所有未来,以检索其输出。通过提供跟踪ID,我们可以使用外部查找来推断哪些未来已完成,并直接请求其结果。
示例
let mut spawned_ids = std::collections::HashSet::new();
let mut pool = LocalPool::new();
let spawner = pool.spawner();
let (id1, handle1) = spawner
.spawn_with_handle(futures::future::ready(1i32))
.unwrap();
let (id2, handle2) = spawner
.spawn_with_handle(futures::future::ready(2u32))
.unwrap();
spawned_ids.insert(id1);
spawned_ids.insert(id2);
while !spawned_ids.is_empty() {
if let Some(completed) = pool.try_run_one() {
assert!(spawned_ids.remove(&completed))
}
}
assert_eq!(handle1.now_or_never().unwrap(), 1);
assert_eq!(handle2.now_or_never().unwrap(), 2);
依赖项
~1MB
~15K SLoC