【发布时间】:2020-09-28 10:13:31
【问题描述】:
我有一个循环,我在其中做一些工作并使用Sender 发送结果。这项工作需要时间,如果失败,我需要重试。可能在我重试时,接收器已关闭,我的重试将浪费时间。因此,我需要一种方法来检查 Receiver 是否可用而不发送消息。
在理想情况下,我希望我的代码在伪代码中看起来像这样:
let (tx, rx) = tokio::sync::mpsc::channel(1);
tokio::spawn(async move {
// do som stuff with rx and drop it after some time
rx.recv(...).await;
});
let mut attempts = 0;
loop {
if tx.is_closed() {
break;
}
if let Ok(result) = do_work().await {
attempts = 0;
let _ = tx.send(result).await;
} else {
if attempts >= 10 {
break;
} else {
attempts += 1;
continue;
}
}
};
问题是Sender 没有is_closed 方法。它确实有pub fn poll_ready(&mut self, cx: &mut Context<'_>) -> Poll<Result<(), ClosedError>>,但我不知道Context 是什么或在哪里可以找到它。
当我没有要发送的值时,如何检查发件人是否能够发送?
【问题讨论】:
标签: rust future rust-tokio