#executor #unique-id #local #localpool

local-pool-with-id

对LocalPool执行器的一个小变体,它公开唯一的ID以跟踪未来的完成情况

2个版本

0.1.1 2020年2月12日
0.1.0 2020年2月12日

#1624 in 异步

MIT许可证

26KB
309

local-pool-with-id

LocalPool执行器的一个小变体,它公开唯一的ID以跟踪未来的完成。

这几乎可以作为一个现有的LocalPool的直接替换。所有现有的特性仍然被实现。有两个API差异

  1. 实现了新的(Local)SpawnWithId特性。这些接受与非ID版本相同的参数,但返回一个唯一的ID,可用于识别启动的未来是否已完成。
  2. 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