如何解决如何将std :: sync :: mpsc :: Sender <T>传递给warp中的处理程序?
在翘曲(生锈)中,如何将std::sync::mpsc::Sender<T>
传递给业务处理程序?以下代码抱怨std::sync::mpsc::Sender<T>
不是Sync
。
我知道我可以用my_sender
之类的东西包装Arc<RwLock<Sender<T>>>
,但这似乎不正确,因为通道的目的是启用线程间通信。
我必须包装Sender<T>
还是有更好的方法?
use std;
use warp::{self,Filter};
fn with_sender<T: Send + Sync>(
sender: std::sync::mpsc::Sender<T>,) -> impl Filter<Extract = (std::sync::mpsc::Sender<T>,),Error = std::convert::Infallible> + Clone
{
warp::any().map(move || sender.clone())
}
// later in main():
let (my_sender,my_receiver) = std::sync::mpsc::channel::<MySyncAndSendType>();
let routes = (warp::get()
.and(warp::path!("some" / "path"))
.map(my_handlers::handler_1)
.map(turn_result_to_json)
.or(warp::post()
.and(warp::path!("some" / "other" / "path"))
.and(warp::multipart::form().max_length(10 * 1024 * 1024))
.and(with_sender(my_sender.clone()))
// -------------------------------------------------------------------------
// -------> I need my_sender in the function my_handlers::handler_2 <-------
.and_then(|form,my_sender| async move {
Ok::<_,Infallible>(my_handlers::handler_2(form,my_sender).await)
})
.map(turn_result_to_json)));
warp::serve(routes).run(([127,1],1234)).await;
解决方法
Sender
不是Sync
,因此无法共享,但是它是 Send
,因此您可以 {{ 1}}放入异步任务。
您的代码存在的问题是,即使内部的move
块是async
,闭包也正在通过引用捕获其环境。您还应该只需要关闭move
:
move
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。