gpt4 book ai didi

rust - 如果流为空(需要等待下一个元素),是否有一种方法可以使StreamExt::next不阻塞(快速失败)?

转载 作者:行者123 更新时间:2023-12-03 11:34:54 24 4
gpt4 key购买 nike

目前我正在做这样的事情

use tokio::time::timeout;

while let Ok(option_element) = timeout(Duration::from_nanos(1), stream.next()).await {
...
}
清空流的rx缓冲区中已经存在的项目。我不想等待尚未收到的下一个元素。
我认为超时会减慢while循环的速度。
我想知道是否有更好的方法可以在不使用超时的情况下做到这一点?
可能像 https://github.com/async-rs/async-std/issues/579,但用于 future /东京的流。

最佳答案

您问题的直接答案是像FutureExt::now_or_never一样,使用 future 周转箱中的 stream.next().now_or_never() 方法。
但是,重要的是要避免编写一个繁忙的循环来等待多个事物,方法是对循环中的每个事物调用now_or_never。这很不好,因为它阻塞了线程,您应该首选其他解决方案(例如 tokio::select! )来等待多件事。对于这种特殊情况,您需要不断检查任务是否应该关闭,请改为this other question
另一方面,使用now_or_never很好的一个示例是当您想为现在可用的项目清空队列时,可以按某种方式进行批处理。这很好,因为now_or_never循环在清空队列后将立即停止旋转。
请注意,如果流为空,则now_or_never将成功,因为在这种情况下next()立即返回None

关于rust - 如果流为空(需要等待下一个元素),是否有一种方法可以使StreamExt::next不阻塞(快速失败)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65391496/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com