如何安全地将这个
response.audio_file
分享到其他线程?
thread::spawn(move || {
prepare_result_files(&response.audio_file);
});
//prepare_result_files(&response.audio_file).await;
Ok(response) // Doesn't work because
我尝试实现 AudioFile 的 Copy 特征,但后来我不能,因为类型的 mosf 无法实现 Copy 特征:
#[derive(Serialize, Deserialize, Debug)]
#[tsync]
pub struct AudioFile {
pub id: i32,
pub name: String,
pub status: Status,
pub results: Option<Vec<ResultFile>>,
}
有什么指点吗?
您可以使用 Arc 和读写锁。
https://doc.rust-lang.org/std/sync/struct.Arc.html
https://doc.rust-lang.org/stable/std/sync/struct.RwLock.html
所以
#[derive(Serialize, Deserialize, Debug)]
#[tsync]
pub struct AudioFile {
pub id: i32,
pub name: String,
pub status: Status,
pub results: Option<Vec<ResultFile>>,
}
你应该将整个响应包裹在一个 Arc 中
let response = Arc::new(RwLock::new(audio_file));
let response_clone = Arc::clone(&response);
thread::spawn(move || {
let audio_file = response_clone.read().await.unwrap();
prepare_result_files(&audio_file);
})
请注意,您将获得audio_file的只读副本 如果您选择,可以使用 .write() 代替,但是,这将锁定文件,直到锁被释放。