Concurrency 从mpsc UnboundedReceiver读取所有可用消息而不进行不必要的阻止

Concurrency 从mpsc UnboundedReceiver读取所有可用消息而不进行不必要的阻止,concurrency,rust,future,Concurrency,Rust,Future,我有一个futures::sync::mpsc::unbounded频道。我可以向UnboundedSender发送消息,但从UnboundedReciever接收消息时遇到问题 我使用通道向UI线程发送消息,并且我有一个每帧调用一次的函数,我希望在每帧上读取通道中的所有可用消息,而不在没有可用消息时阻塞线程 从我所读到的Future::poll方法正是我所需要的,我只是轮询,如果我得到Async::Ready,我会处理消息,如果没有,我就从函数返回。 问题是当没有任务上下文时,poll会惊慌失

我有一个
futures::sync::mpsc::unbounded
频道。我可以向
UnboundedSender
发送消息,但从
UnboundedReciever
接收消息时遇到问题
我使用通道向UI线程发送消息,并且我有一个每帧调用一次的函数,我希望在每帧上读取通道中的所有可用消息,而不在没有可用消息时阻塞线程

从我所读到的
Future::poll
方法正是我所需要的,我只是轮询,如果我得到Async::Ready,我会处理消息,如果没有,我就从函数返回。
问题是当没有任务上下文时,
poll
会惊慌失措(我不知道这意味着什么,也不知道该怎么办)

我尝试的是:

let (sender, receiver) = unbounded(); // somewhere in the code, doesn't matter
// ...
let fut = match receiver.by_ref().collect().poll() {
    Async::Ready(items_vec) => // do something on UI with items,
    _ => return None
}
这种恐慌是因为我没有任务上下文

还尝试:

let (sender, receiver) = unbounded(); // somewhere in the code, doesn't matter
// ...
let fut = receiver.by_ref().collect(); // how do I run the future?
tokio::runtime::current_thread::Runtime::new().unwrap().block_on(fut); // this blocks the thread when there are no items in the receiver
当流中没有项目时,我想帮助阅读
UnboundedReceiver
,而不阻塞线程(然后什么也不做)


谢谢

您错误地使用了futures--您需要一个
运行时
和一个更多的样板文件来实现这一点:


外部板条箱东京;
外部板条箱期货;
使用东京::前奏::*;
使用futures::future:{lazy,ok};
使用futures::sync::mpsc::unbounded;
使用tokio::runtime::runtime;
fn main(){
let(发送方,接收方)=无界::();
让receiver=receiver.for|u每个(|结果|{
println!(“得到:{}”,结果);
好(())
});
让rt=Runtime::new().unwrap();
rt.executor().spawn(接收方);
让懒惰的未来=懒惰(移动){
sender.unbounded_send(1).unwrap();
sender.unbounded_send(2).unwrap();
sender.unbounded_send(3).unwrap();
好::(())
});
rt.block_on_all(lazy_future).unwrap();
}
进一步阅读:

[…]为了使用Tokio并成功执行任务,应用程序必须启动执行器以及应用程序任务所依赖的资源的必要驱动程序。这需要大量的样板文件。为了管理样板文件,Tokio提供了几个运行时选项。运行时是一个执行器,它与所有必要的驱动程序捆绑在一起,为东京的资源提供动力。运行时不是单独管理所有不同的Tokio组件,而是在一次调用中创建和启动

东京提供了一个和一个。并发运行时由多线程、窃取工作的执行器支持。单线程运行时执行当前线程上的所有任务和驱动程序。用户可以选择最适合应用程序的运行时特征


@E_Net4;是我尝试的又一个例子