如何使用 Tokio oneshot 发送器和接收器执行具有内循环的不同任务?

Adr*_*des 1 future rust rust-tokio

不知道如何处理这里的借用检查器。

use tokio::sync::oneshot; // 1.0.2

fn main() {
    let (sender, receiver) = oneshot::channel::<u8>();
    tokio::spawn(async move {
        loop {
            sender.send(3).unwrap();
        }
    });
}
Run Code Online (Sandbox Code Playgroud)

创建此错误:

error[E0382]: use of moved value: `sender`
 --> src/main.rs:7:13
  |
7 |             sender.send(3).unwrap();
  |             ^^^^^^ value moved here, in previous iteration of loop
  |
  = note: move occurs because `sender` has type `tokio::sync::oneshot::Sender<u8>`, which does not implement the `Copy` trait
Run Code Online (Sandbox Code Playgroud)

She*_*ter 8

你不知道。这就是一次性通道的全部要点:它最多只能使用一次:

\n
\n

用于在异步任务之间发送单个消息的通道。

\n

\xe2\x80\x94tokio::sync::oneshot

\n
\n

听起来您想要一种不同类型的频道,例如tokio::sync::mpsc.

\n
\n
\n

如果我只想在循环开始时发送一条消息怎么办?

\n
\n

然后执行循环开始前的代码:

\n
use tokio::sync::oneshot; // 1.0.2\n\nfn main() {\n    let (sender, receiver) = oneshot::channel::<u8>();\n    tokio::spawn(async move {\n        sender.send(3).unwrap();\n        \n        loop {\n            // Do things\n        }\n    });\n}\n
Run Code Online (Sandbox Code Playgroud)\n

如果必须将其放在循环内,则需要动态地将值标记为不再存在并处理这种情况。在这里,我使用Optionand if let

\n
use tokio::sync::oneshot; // 1.0.2\n\nfn main() {\n    let (sender, receiver) = oneshot::channel::<u8>();\n    tokio::spawn(async move {\n        let mut sender = Some(sender);\n        \n        loop {\n            if let Some(sender) = sender.take() {\n                sender.send(3).unwrap();\n            }\n            // Do things\n        }\n    });\n}\n
Run Code Online (Sandbox Code Playgroud)\n