问题标签 [rust-tokio]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
http - 如何在 Rust 中使用 hyper、tokio 和 futures 为 HTTP 请求设置超时?
如何使用异步 Hyper (>= 0.11) 为 HTTP 请求设置超时?
这是没有超时的代码示例:
asynchronous - 从流中将数据转发到 Tokio mpsc 频道
我正在尝试创建一个异步 Rust 客户端,该客户端连接到一端的 WebSocket 服务器和另一端的蓝牙加密狗。在这两者之间会有一些逻辑来过滤消息。
我在 WebSocket 端使用rust-websocket的异步模块。
我想隔离三个组件(websocket 发送/接收、蓝牙发送/接收、消息处理)。为了做到这一点,我想使用一个futures::sync::mpsc
通道作为通道Sink
,以便将消息从 WebSocket 接收器传递到循环的消息处理部分。以下是我的代码的简化部分:
但是,当我运行此代码时,会收到几条如下所示的错误消息:
我试图用 a 来破解它.map_err
,将错误转换为 a SendError
,但SendError
结构是私有的。
rust - 如何将期货附加到 BufferUnordered 流?
我正在尝试将期货附加到BufferUnordered
. 目前我将它们直接推送到底层流中,Fuse
流BufferUnordered
是空的,所以推送到它没有效果,下面的循环没有收到第三个响应。next
将(1)的定义更改为stream.buffer_unordered(1)
似乎可以使其工作,因为基础流不是空的/已完成。
如何添加更多期货BufferUnordered
?我真的必须把它锁起来或按照这些思路做一些事情吗?
sql-server - 如何将所有行作为带有 tiberius 期货的向量?
我需要使用tiberius收集表的所有行并输出它们。我的简单代码是:
此代码打印一个空向量,但我需要完整的字符串向量。我读过一些关于期货的文章,但作为 Rust 的新手,它们对我来说看起来太复杂了。
stream - 延迟 Tokio 流
给定 a Stream
,我想创建一个新的Stream
元素,其中元素之间存在时间延迟。
我尝试编写使用stokio_core::reactor::Timeout
和and_then
组合子的代码Stream
,但延迟不起作用:我立即获得所有元素,没有延迟。
这是一个自包含的示例(操场):
为了完整起见,这是我得到的输出:
我怀疑问题出在以下几行:
我可能并没有真正等待返回的Timeout
对象,尽管我不确定如何解决它。
tcp - 当客户端连接到 tokio-proto 服务器时,如何显示欢迎消息/横幅?
SMTP 服务器应在建立连接时显示欢迎消息(220 服务就绪),这是客户端开始发送命令的信号。这似乎与 tokio-proto 的请求-响应范式相冲突。
我可以想象协议可以完全颠倒,例如服务器发送请求和客户端响应(不推荐使用的 TURN),但目前我只关心连接时的欢迎消息,也就是横幅。之后,客户端请求 => 服务器响应将被支持。
我一直在想把它挂在哪里,但是bind_server
,bind_transport
对我来说是超级神秘的。我需要实施运输吗?
我在decode
编解码器的方法中有这个。问题是decode
除非有可用于解码哪种有意义的数据,否则不会调用该方法。我希望有一些连接初始化方法可以挂钩,但我什么也没找到。
rust - 如何在不使用 tokio_proto crate 的情况下从 tokio TCP 连接中读取数据?
我正在尝试编写一个 TCP 客户端来打印传入的消息。我想出了以下代码:
它编译但失败并出现Buffer NotReady
错误。
multithreading - 防止 `chan::Receiver` 阻塞空缓冲区
我想构建一个多生产者多消费者(MPMC)通道,其中包含不同的并发任务处理和生成数据。其中一些任务负责与文件系统或网络进行交互。
两个例子:
PrintOutput(String)
将由记录器、控制台输出或 GUI 使用。NewJson(String)
将由记录器或解析器使用。
为了实现这一点,我选择chan
了 MPMC 通道提供者和tokio
系统来管理通道上每个侦听器的事件循环。
在阅读了tokio 网站上的示例后,我开始实施futures::stream::Stream
for chan::Receiver
。这将允许使用 a for each future 在频道上收听。但是,这两个库的文档突出了一个冲突:
fn poll(&mut self) -> Poll<Option<Self::Item>, Self::Error>
尝试提取此流的下一个值,如果流完成则返回 None。
这个方法和 Future::poll 一样,是从流中提取值的唯一方法。此方法还必须通常在任务的上下文中运行,并且此 trait 的实现者必须确保此方法的实现不会阻塞,因为它可能会导致消费者表现不佳。
fn recv(&self) -> Option<T>
在此通道上接收一个值。
如果这是一个异步通道,recv 仅在缓冲区为空时阻塞。
如果这是一个同步通道,recv 仅在缓冲区为空时阻塞。
如果这是一个集合通道,recv 会阻塞,直到相应的发送发送一个值。
对于所有通道,如果通道关闭且缓冲区为空,则 recv 始终立即返回 None。(如果缓冲区在关闭的通道上非空,则返回缓冲区中的值。)
保证以与发送它们相同的顺序接收值。
这个操作永远不会恐慌!但如果通道从不关闭,它可能会死锁。
chan::Receiver
当缓冲区为空时可能会阻塞,但futures::stream::Stream
希望在轮询时永远不会阻塞。
如果空缓冲区阻塞,则没有明确的方法来确认它是空的。如何检查缓冲区是否为空以防止阻塞?
虽然Kabuki在我的雷达上并且似乎是最成熟的演员模型板条箱,但它几乎完全缺乏文档。
到目前为止,这是我的实现:
我已经完成了一个快速测试,看看它是如何工作的。看起来不错,但正如预期的那样,在完成缓冲区后会阻塞。虽然这应该可行,但我有点担心消费者“行为不端”意味着什么。现在我将继续测试这种方法,希望我不会遇到不良行为。
request - 如何在 Rust 中使用 tokio_proto 和 tokio_service 流式传输消息
在我的SmtpService
情况下,我想在处理完成后立即发送响应头和正文。这应该遵循 SMTP 交换:
我在操场上有这么多:
我想知道是否有可能,或者我是否需要生成两条消息——一条用于 DATA,另一条用于实际字节流?
我得到的错误显示消息结构不匹配;身体/未来显然不合适: