如何将 std::sync::mpsc::Sender<T> 传递给 warp 中的处理程序?
How to pass a std::sync::mpsc::Sender<T> to a handler in warp?
在 warp (rust) 中,我如何将 std::sync::mpsc::Sender<T>
传递给我的业务处理程序?以下代码抱怨 std::sync::mpsc::Sender<T>
不是 Sync
.
我知道我可以用 Arc<RwLock<Sender<T>>>
之类的东西包装 my_sender
,但这似乎不对,因为通道的目的是启用线程间通信。
我是否必须包装 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, 0, 0, 1], 1234)).await;
Sender
不是Sync
,所以不能分享,但是是Send
,所以你可以 move
它进入异步任务。
您的代码的问题在于闭包通过引用捕获其环境,即使内部的 async
块是 move
。您也应该只需要关闭 move
:
.and_then(move |form, my_sender| async move {
Ok::<_, Infallible>(my_handlers::handler_2(form, my_sender).await)
})
在 warp (rust) 中,我如何将 std::sync::mpsc::Sender<T>
传递给我的业务处理程序?以下代码抱怨 std::sync::mpsc::Sender<T>
不是 Sync
.
我知道我可以用 Arc<RwLock<Sender<T>>>
之类的东西包装 my_sender
,但这似乎不对,因为通道的目的是启用线程间通信。
我是否必须包装 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, 0, 0, 1], 1234)).await;
Sender
不是Sync
,所以不能分享,但是是Send
,所以你可以 move
它进入异步任务。
您的代码的问题在于闭包通过引用捕获其环境,即使内部的 async
块是 move
。您也应该只需要关闭 move
:
.and_then(move |form, my_sender| async move {
Ok::<_, Infallible>(my_handlers::handler_2(form, my_sender).await)
})