rust - 如何将std::sync::mpsc::Sender <T>传递给warp中的处理程序?

标签 rust async-await move-semantics rust-warp

在翘曲(使用rust )中,如何将std::sync::mpsc::Sender<T>传递给业务处理程序?以下代码提示std::sync::mpsc::Sender<T>不是Sync
我知道我可以用my_sender之类的东西包装Arc<RwLock<Sender<T>>>,但这似乎不正确,因为channel的目的是启用线程间通信。
我是否必须包装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)
})

关于rust - 如何将std::sync::mpsc::Sender <T>传递给warp中的处理程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63432657/

相关文章:

rust - Serde 结构版本检查

Rust RAM 限制 LRU 缓存?

javascript - 异步/等待和 promise

c# - 我应该使用什么作为虚拟等待?

c++ - 具有显式析构函数和 std::unique_ptr<> 成员的类不能在 std::vector<> 中使用?

c++ - 如何为运算符正确编写 R 值重载

c++ - 将 std::vector<std::unique_ptr<T>> 分配给另一个 std::vector<std::unique_ptr<T>>

rust - 一个从切片中获取 X 元素的衬垫

rust - 如何在不使用大量 RAM 的情况下创建压缩的 tar 文件?

javascript - 节点等待不等待 promise