Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Rust Can';t让RwLock在多线程应用程序中工作_Rust_Rust Tokio - Fatal编程技术网

Rust Can';t让RwLock在多线程应用程序中工作

Rust Can';t让RwLock在多线程应用程序中工作,rust,rust-tokio,Rust,Rust Tokio,我正在尝试实现tokio::sync::RwLock,因为如果配置文件发生更改,我的应用程序应该重新加载配置文件。这涉及到用新变量重新分配Vec变量,但在任何时候都可能有多个读卡器 有一个名为Manifest的结构,它表示可用于我设计的硬件的二进制文件的“列表”。该列表是一个JSON文件,它在启动时和任何时候更改时都会被解析 使用notify::{watcher,RecursiveMode,watcher}; 使用semver::Version; 使用serde::{反序列化,序列化}; 使用

我正在尝试实现
tokio::sync::RwLock
,因为如果配置文件发生更改,我的应用程序应该重新加载配置文件。这涉及到用新变量重新分配
Vec
变量,但在任何时候都可能有多个读卡器

有一个名为
Manifest
的结构,它表示可用于我设计的硬件的二进制文件的“列表”。该列表是一个JSON文件,它在启动时和任何时候更改时都会被解析


使用notify::{watcher,RecursiveMode,watcher};
使用semver::Version;
使用serde::{反序列化,序列化};
使用std::sync::mpsc::channel;
使用std::time::Duration;
使用std::{fs::File,sync::Arc,thread};
使用tokio::sync::rBlock;
#[派生(序列化、反序列化、调试、克隆)]
发布结构二进制文件{
版本:版本,,
硬件:版本,
要求:版本,
文件:String,
}
发布结构清单{
路径:字符串,
舱单更改:bool,
双星:Arc,
}
执行清单{
pub fn new(路径:String)->Manifest{
让bin=Arc::new(RwLock::new(Vec::new());
线程::生成(移动| |异步移动{
让bins=Arc::克隆(&bins);
let(tx,rx)=信道();
让mut watcher=watcher(tx,Duration::from_secs(10)).unwrap();
watcher.watch(路径,递归模式::非递归).unwrap();
环路{
匹配rx.recv(){
正常(事件)=>{
让file=file::open(path).unwrap();
让mut bins=bins.write().wait;
*bins=serde_json::from_reader(file).unwrap();
}
Err(e)=>println!(“监视错误:{:?}”,e),
}
}
});
显示{
路径:路径,
清单(u)更改:对,,
二进制文件:垃圾箱,
}
}
发布异步fn getAvailableBynaries(self,hwv:Version,fwv:Version)->Vec{
self.binaries.read().wait.to_vec();
}
}
我的问题是编译器抱怨:

future无法在线程之间安全发送
异步块创建的未来不是“发送”`
帮助:未为'std::Sync::mpsc::Receiver'rustc'实现特性'std::marker::Sync'
rs(28,9):异步块创建的未来不是“发送”`
rs(35,23):具有类型`&std::sync::mpsc::Receiver`,而不是`发送'`
rs(38,40):此处出现wait,后面可能会使用'rx'
manifest.rs(44,13):'rx'后来被放在这里
mod.rs(617,8):在'std::thread::spawn'中此绑定需要`

我不知道为什么通道
Receiver
实现
Send
很重要,因为它是在闭包/线程中创建的。进一步讲,我真的不知道该找什么。

我对
async
还不熟悉,但在我看来,代码似乎缺少一些东西<代码>异步移动{…}是未来的趋势<代码>移动| |异步移动{…}是一个返回未来的闭包
thread::spawn
在另一个线程中运行闭包,如果对其调用
join()
,则从
JoinHandle
返回未来(您没有这样做)。这段代码中的任何内容实际上都不会轮询未来(导致它被执行),除非我偏离了基准。这似乎不太可能是您想要的。我认为您希望使用
tokio::spawn
而不是
thread::spawn
,并且只使用和
async move
block而不是返回未来的闭包。这对
tokio::spawn
不起作用,因为代码在内部使用阻塞操作(等待通道)。代码应该只使用异步原语或者只使用同步函数。在这种情况下,后者似乎更合理,因为
notify
使用阻塞通道。它是否是
Send
很重要,因为异步函数可以在每个
线程之间移动。wait
。在配置文件的特定情况下,您可能应该使用通道,而不是
RwLock
。很难回答您的问题,因为它不包含通道。我们无法说出代码中存在哪些板条箱(及其版本)、类型、特征、字段等。如果您试图重现您的错误(如果可能的话),或者在全新的货运项目中,那么我们将更容易帮助您,然后您的问题将包括附加信息。您可以使用以下方法减少在此处发布的原始代码。谢谢我不熟悉
异步
,但在我看来,代码似乎缺少一些东西<代码>异步移动{…}是未来的趋势<代码>移动| |异步移动{…}是一个返回未来的闭包
thread::spawn
在另一个线程中运行闭包,如果对其调用
join()
,则从
JoinHandle
返回未来(您没有这样做)。这段代码中的任何内容实际上都不会轮询未来(导致它被执行),除非我偏离了基准。这似乎不太可能是您想要的。我认为您希望使用
tokio::spawn
而不是
thread::spawn
,并且只使用和
async move
block而不是返回未来的闭包。这对
tokio::spawn
不起作用,因为代码在内部使用阻塞操作(等待通道)。代码应该只使用异步原语或者只使用同步函数。在这种情况下,后者似乎更合理,因为
notify
使用阻塞通道。它是否是
Send
很重要,因为异步函数可以在每个
线程之间移动。wait
。在配置文件的特定情况下,您可能应该使用通道,而不是
RwLock
。很难回答您的问题,因为它不包含通道。我们无法说出代码中存在哪些板条箱(及其版本)、类型、特征、字段等。如果你愿意,我们会更容易帮助你