#future #stream #async-stream #async #hash-map #data-structures #futures-unordered

mapped_futures

基于 FuturesUnordered 的期货集合,支持通过键插入、删除和修改期货

3 个版本

0.1.12 2024 年 7 月 18 日
0.1.11 2024 年 7 月 18 日
0.1.8 2023 年 6 月 19 日

#254 in 异步

Download history 231/week @ 2024-05-03 287/week @ 2024-05-10 251/week @ 2024-05-17 248/week @ 2024-05-24 279/week @ 2024-05-31 288/week @ 2024-06-07 155/week @ 2024-06-14 211/week @ 2024-06-21 219/week @ 2024-06-28 202/week @ 2024-07-05 532/week @ 2024-07-12 332/week @ 2024-07-19 316/week @ 2024-07-26 269/week @ 2024-08-02 186/week @ 2024-08-09 214/week @ 2024-08-16

987 每月下载次数

GPL-3.0 许可证

105KB
2K SLoC

映射期货

该库包含多个结构体,将键映射到异步任务。它包含 MappedFuturesBiMultiMapFuturesMappedStreamsBiMultiMapStreams。一旦添加,如果拥有键,则可以修改或删除期货或流。这些模块将映射数据结构添加到 FuturesUnordered,因此期货仅在唤醒后才会轮询,并且会以非顺序完成。

您可以使用映射创建映射,插入期货,取消它们,并等待下一个完成的期货,这将返回期货的输出及其键。如果期货是 Unpin,则可以使用 MappedFutures::get_mut() 获取引用进行修改,否则必须使用 MappedFutures::get_pin_mut()

use crate::mapped_futures::*;
use futures::executor::block_on;
use futures::future::LocalBoxFuture;
use futures_timer::Delay;
use futures_util::StreamExt;
use std::time::Duration;

let mut futures = MappedFutures::new();
futures.insert(1, Delay::new(Duration::from_millis(50)));
futures.insert(2, Delay::new(Duration::from_millis(75)));
futures.insert(3, Delay::new(Duration::from_millis(100)));
assert_eq!(futures.cancel(&1), true);
futures.get_pin_mut(&2).unwrap().reset(Duration::from_millis(125));
assert_eq!(block_on(futures.next()).unwrap().0, 3);
assert_eq!(block_on(futures.next()).unwrap().0, 2);
assert_eq!(block_on(futures.next()), None);

为了从映射中检索任何所有权期货,期货必须是 Unpin,例如,可以通过在 Box::pin() 中封装它们来实现。

use crate::mapped_futures::*;
use futures::executor::block_on;
use futures::future::LocalBoxFuture;
use futures_timer::Delay;
use futures_util::StreamExt;
use std::time::Duration;

futures.insert(1, Box::pin(Delay::new(Duration::from_millis(50))));
futures.insert(2, Box::pin(Delay::new(Duration::from_millis(75))));
futures.insert(3, Box::pin(Delay::new(Duration::from_millis(100))));
assert_eq!(block_on(futures.remove(&1)).unwrap().0, ());
assert_eq!(block_on(futures.replace(&2, Delay::new(Duration::from_millis(125)))).unwrap().0, ());
assert_eq!(block_on(futures.next()).unwrap().0, 3);

对于 MappedStreams 也存在类似的接口,但使用流而不是期货。如果您的期货映射需求更复杂,则可以使用 BiMultiMapFutures,它支持期货与两种键之间的一对多关系。因此,每个键将关联零个或多个期货,但每个 (leftkey, rightkey) 对将关联最多一个期货。 BiMultiMapStreams 对流执行相同的操作。

依赖项

~0.7–1MB
~21K SLoC