gpt4 book ai didi

rust - 从 future 流中获取所有可用项目(非阻塞)

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

我有一个WebSocket连接,其中包装了futures_core::stream::Stream(传入)和Sink(传出)。
我想解码和处理来自Stream的所有可用消息,而不会阻塞。显然,在套接字级别,它是一个TCP/IP字节流,套接字中将有0..N条消息接收缓冲区,以等待对read()的调用。无阻塞的read调用可以很好地读取多个管道化的websocket框架。在Rust抽象层次上,这可以通过 fn poll_next(...) 来实现:

The trait is modelled after Future, but allows poll_next to be calledeven after a value has been produced, yielding None once the streamhas been fully exhausted.


但是,我不知道如何在没有async/await语法的情况下直接使用此轮询方法,即使可以,我也看不到它如何解决问题。如果我在取回Some(frame)并在Vec中收集帧时在循环中调用它,当它用完缓冲的帧并返回 Poll::Pending时,它仍将挂起任务-因此我将无能为力反正立即收集到的帧。理想情况下,我需要在收到Poll::Pending时处理已收集的帧,而不暂停任何内容,然后再次调用它,仅在需要时才允许它第二次暂停。这里是否有可能不涉及丢弃所有 future 抽象并自己求助于缓冲和解析Web套接字框架的解决方案?

最佳答案

您似乎对暂停的工作方式有误解。当父函数在循环中调用poll_next时,不是poll_next返回Poll::Pending导致挂起。而是当包含循环的函数返回一个Poll::Pending结果时。但是没有什么可以说您必须立即这样做。在返回执行器之前,您可以自由处理已收集的帧。

关于rust - 从 future 流中获取所有可用项目(非阻塞),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64507788/

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