如何通过线程填充结构体向量?(Rust实现)
解决Rust多线程MapReduce风格处理CSV并填充结构体向量的问题
你的问题核心是类型不匹配:
- 你定义的
data是Vec<SomeStruct>,但thread::spawn返回的是JoinHandle<SomeStruct>类型,直接push会导致类型错误 - 后续尝试调用
join()时,data里的元素是SomeStruct,自然没有join方法
以下是符合Rust风格的正确实现:
首先定义你的结构体(示例补充必要字段):
use csv::StringRecord; use std::thread; #[derive(Debug)] struct SomeStruct { // 根据你的CSV字段定义结构体字段,示例: id: u32, name: String, }
然后修改代码逻辑,正确收集线程句柄并最终获取结果:
fn main() -> Result<(), Box<dyn std::error::Error>> { let rdr = csv::Reader::from_path("data.csv")?; // 调整容器类型为存储线程句柄 let mut handles: Vec<thread::JoinHandle<SomeStruct>> = Vec::new(); // 提前定义映射逻辑,避免循环内重复创建闭包 let map_some_struct = |record: StringRecord| -> SomeStruct { // 根据CSV记录构造结构体,示例逻辑 SomeStruct { id: record[0].parse().unwrap(), name: record[1].to_string(), } }; for result in rdr.records() { let record = result?; // 将CSV记录移动到线程闭包,在线程内执行映射 handles.push(thread::spawn(move || map_some_struct(record))); } // 遍历线程句柄,收集所有线程的执行结果 let final_result: Vec<SomeStruct> = handles .into_iter() .map(|handle| handle.join().unwrap()) .collect(); // 验证结果 println!("{:?}", final_result); Ok(()) }
关键说明:
- 容器类型从
Vec<SomeStruct>改为Vec<thread::JoinHandle<SomeStruct>>,用来保存每个线程的句柄,而非直接存储结构体 - 把映射逻辑放在线程闭包内执行,确保计算任务分配到多线程中(如果映射逻辑是CPU/IO密集型,多线程才有实际收益)
- 通过
join()方法等待线程完成并获取返回值,最终收集成目标结构体向量
内容的提问来源于stack exchange,提问作者Andrey Shchedrin
相关产品推荐
相关产品推荐

