我想将一些 aysnc 操作存储在哈希表中。然后根据用户输入的字符串列表获取异步操作列表。通过搜索网站,我发现了这个问题
不同之处在于我想在不同的 tokio 线程中使用存储操作哈希图。所以我用 once_cell + RwLock 重写。
static MAPS: Lazy<Arc<RwLock<HashMap<&'static str, CalcFn>>>> = Lazy::new(|| {
let map = Arc::new(RwLock::new(HashMap::new()));
let mut map_lock = map.write().unwrap();
map_lock.insert(
"add",
Box::new(
move |a: i32, b: i32| -> Pin<Box<dyn Future<Output = BoxedResult<i32>>>> {
Box::pin(add(a, b))
},
) as CalcFn,
);
map_lock.insert(
"sub",
Box::new(
move |a: i32, b: i32| -> Pin<Box<dyn Future<Output = BoxedResult<i32>>>> {
Box::pin(sub(a, b))
},
) as CalcFn,
);
map.clone()
});
延迟初始化看起来很无聊并且占用很多行代码,因为我可能有 20 多个异步操作。
有人能否提供一些评论以便以“更清晰”的方式编写此示例?
首先要做的是尽可能将插入操作移到另一个函数中。
clone
最后你不需要使用。你只需要在返回之前放下锁即可。您不需要
Arc
。Arc
可以用来确保一个值在多个线程中保持活动,但static
已经确保了这一点。在您发布的代码中,您也不需要
RwLock
,但如果您在构建后修改地图,则可能需要这样做。如果你使用的是 Rust 的最新稳定版本,你可以使用
LazyLock
标准库中的版本。其工作原理与 中的相同once_cell
。您通常不需要错误
Sync
,但您经常需要未来Send
,以便它们可以在多线程运行时产生。接下来我们得到以下内容:
Rust 游乐场