3 个版本
0.1.12 | 2024 年 7 月 18 日 |
---|---|
0.1.11 | 2024 年 7 月 18 日 |
0.1.8 |
|
#254 in 异步
987 每月下载次数
105KB
2K SLoC
映射期货
该库包含多个结构体,将键映射到异步任务。它包含 MappedFutures
、BiMultiMapFutures
、MappedStreams
和 BiMultiMapStreams
。一旦添加,如果拥有键,则可以修改或删除期货或流。这些模块将映射数据结构添加到 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