【发布时间】:2020-06-23 15:36:40
【问题描述】:
我的用例:
- 我有一个大型复杂结构。
- 我想拍摄这个结构的快照,以将其发送到线程进行计算。
- 此结构中的许多大字段不需要计算。
- 结构中的许多字段是部分必需的(一个字段可能是一个结构,而该结构中只有几个参数是必需的)。
目前我只需调用.clone() 并将整个结构的克隆传递给线程。
很难给出一个好的例子,但这是我目前的方法的一个总结:
use tokio::task;
fn main() {
let compex_struct = ComplexStruct::new(...);
// some extra async stuff I don't think is 100% neccessary to this question
let future = async_function(compex_struct.clone()); // Ideally not cloning whole struct
// some extra async stuff I don't think is 100% neccessary to this question
}
fn async_function(complex_struct:ComplexStruct) -> task::JoinHandle<_> {
task::spawn_blocking(move || {
// bunch of work, then return something
})
}
我目前的工作想法是有一个单独的结构,例如ThreadData,它用ThreadData::new(ComplexStruct) 实例化并有效地克隆所需的字段。然后我将ThreadData 传递给线程。
这个问题的最佳解决方案是什么?
【问题讨论】:
-
如果你的结构很复杂,有时你只需要它的一部分,它可能不是很 SRP,你可能还是应该重构你的代码。
-
你的问题是“我如何不克隆我不需要的东西”,答案是“不要克隆你不需要的东西”。我看不出你希望从除此之外的答案中得到什么。
-
一个想法可能是将您的一些“许多大字段”放在
Arcs 后面,以便克隆结构变得相对便宜。与将整个结构放在Arc中相比,这具有一些优势(例如,不同的结构可能共享其字段的子集)。如果需要,您可以使用.make_mut()来获得写时复制语义。但将这个大结构重构为更易于管理的东西可能会更好。
标签: rust rust-tokio