Concurrency 克隆东京地震道的替代方案';s期货发送方';闭包

Concurrency 克隆东京地震道的替代方案';s期货发送方';闭包,concurrency,rust,rust-tokio,Concurrency,Rust,Rust Tokio,我正在使用tokio和hyper来生成几个任务 // Defining the task let task = self.some_future_using .map(move |resp| println!("OK: {}", resp)) .map_err(move |e| println!("Error: {}",e)); // Spawning the task tokio::spawn(task); 我不想简单地记录结果,而是希望通过

我正在使用
tokio
hyper
来生成几个任务

// Defining the task
let task = self.some_future_using
            .map(move |resp| println!("OK: {}", resp))
            .map_err(move |e| println!("Error: {}",e));

// Spawning the task
tokio::spawn(task);
我不想简单地记录结果,而是希望通过一个有界的tokio通道发送结果

// Defines the channel
let (tx, rx) = mpsc::channel(10);

// Defining the task
let task = self.some_future_using
            .map(|resp| /* Send Ok(resp) to tx */ )
            .map_err(|e| /* Send Err(e) to tx */);

// Spawning the task
tokio::spawn(task);
由于两个闭包可能都超出了定义
tx
的范围,我们需要为两个闭包克隆并移动
tx

// Defines the channel
let (tx, rx) = mpsc::channel(10);
let mut tx_ok = tx.clone();
let mut tx_err = tx.clone();

// Defining the task
let task = self.some_future_using
            .map(move |resp| tx_ok.try_send(Ok(())).unwrap() )
            .map_err(move |e| tx_err.try_send(Ok(())).unwrap() );

// Spawning the task
tokio::spawn(task);
在使用组合器添加更多逻辑的情况下(
map
和_-then
,等等),每个闭包都需要自己的
tx
克隆版本才能使用它

克隆是唯一的解决办法吗?如果不为每个使用通道的声明闭包克隆通道的发送方,我们是否可以实现同样的效果

如果不为每个使用通道的声明闭包克隆通道的发送方,我们是否可以实现同样的效果

不可以。这就是
发送者的共享方式,没有其他安全的方法

通道通过将共享资源包装在
Arc
s中来管理这些资源,因此可以在线程之间安全地共享这些资源。
Sender
的克隆方法涉及到一些逻辑,但归根结底是关于克隆那些
Arc
s,这就是
Arc
s的共享方式


克隆一个
Arc
很便宜,而且可能不是你应该担心的事情,除非你是在一个紧密的循环中克隆它们。一旦它们被克隆,一个
弧的开销就很小了
——每个克隆本质上就是一个指针。

您是否看到克隆发送者的开销很大?我希望这是一个非常有效的操作。在您的示例中,您可以避免一个克隆。“每个闭包都需要它自己的tx克隆版本才能使用它。”=>“每个闭包都需要它自己的tx版本才能使用它。”我不怕性能。这更像是一个语法/风格导向的问题。在我有10个闭包的情况下,我希望避免键入clone 10次。