问题标签 [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.

0 投票
2 回答
3518 浏览

http - 如何在 Rust 中使用 hyper、tokio 和 futures 为 HTTP 请求设置超时?

如何使用异步 Hyper (>= 0.11) 为 HTTP 请求设置超时?

这是没有超时的代码示例:

0 投票
1 回答
1582 浏览

asynchronous - 从流中将数据转发到 Tokio mpsc 频道

我正在尝试创建一个异步 Rust 客户端,该客户端连接到一端的 WebSocket 服务器和另一端的蓝牙加密狗。在这两者之间会有一些逻辑来过滤消息。

我在 WebSocket 端使用rust-websocket的异步模块。

我想隔离三个组件(websocket 发送/接收、蓝牙发送/接收、消息处理)。为了做到这一点,我想使用一个futures::sync::mpsc通道作为通道Sink,以便将消息从 WebSocket 接收器传递到循环的消息处理部分。以下是我的代码的简化部分:

但是,当我运行此代码时,会收到几条如下所示的错误消息:

我试图用 a 来破解它.map_err,将错误转换为 a SendError,但SendError结构是私有的。

0 投票
0 回答
555 浏览

rust - 如何将期货附加到 BufferUnordered 流?

我正在尝试将期货附加到BufferUnordered. 目前我将它们直接推送到底层流中,FuseBufferUnordered是空的,所以推送到它没有效果,下面的循环没有收到第三个响应。next将(1)的定义更改为stream.buffer_unordered(1)似乎可以使其工作,因为基础流不是空的/已完成。

如何添加更多期货BufferUnordered?我真的必须把它锁起来或按照这些思路做一些事情吗?

0 投票
1 回答
1145 浏览

sql-server - 如何将所有行作为带有 tiberius 期货的向量?

我需要使用tiberius收集表的所有行并输出它们。我的简单代码是:

此代码打印一个空向量,但我需要完整的字符串向量。我读过一些关于期货的文章,但作为 Rust 的新手,它们对我来说看起来太复杂了。

0 投票
1 回答
1047 浏览

stream - 延迟 Tokio 流

给定 a Stream,我想创建一个新的Stream元素,其中元素之间存在时间延迟。

我尝试编写使用stokio_core::reactor::Timeoutand_then组合子的代码Stream,但延迟不起作用:我立即获得所有元素,没有延迟。

这是一个自包含的示例(操场):

为了完整起见,这是我得到的输出:

我怀疑问题出在以下几行:

我可能并没有真正等待返回的Timeout对象,尽管我不确定如何解决它。

0 投票
2 回答
6526 浏览

tcp - 使用 TcpConnectionNew 时不满足 trait bound `(): futures::Future`

我正在尝试使用Tokio crate 在 Rust 中编写一个简单的 TCP 客户端。我的代码非常接近这个例子减去 TLS:

但是,编译失败并出现以下错误:

我觉得这很奇怪,因为根据文档,它应该被实施。

我正在使用

  • 锈 1.19.0
  • 期货 0.1.16
  • 东京核心 0.1.10
  • 东京io 0.1.3

我错过了什么?

0 投票
1 回答
177 浏览

tcp - 当客户端连接到 tokio-proto 服务器时,如何显示欢迎消息/横幅?

SMTP 服务器应在建立连接时显示欢迎消息(220 服务就绪),这是客户端开始发送命令的信号。这似乎与 tokio-proto 的请求-响应范式相冲突。

我可以想象协议可以完全颠倒,例如服务器发送请求和客户端响应(不推荐使用的 TURN),但目前我只关心连接时的欢迎消息,也就是横幅。之后,客户端请求 => 服务器响应将被支持。

我一直在想把它挂在哪里,但是bind_server,bind_transport对我来说是超级神秘的。我需要实施运输吗?

我在decode编解码器的方法中有这个。问题是decode除非有可用于解码哪种有意义的数据,否则不会调用该方法。我希望有一些连接初始化方法可以挂钩,但我什么也没找到。

正在进行的研究项目在 GitHub 上,我还打开了一个关于 tokio-proto 的问题

0 投票
1 回答
2103 浏览

rust - 如何在不使用 tokio_proto crate 的情况下从 tokio TCP 连接中读取数据?

我正在尝试编写一个 TCP 客户端来打印传入的消息。我想出了以下代码:

它编译但失败并出现Buffer NotReady错误。

0 投票
1 回答
375 浏览

multithreading - 防止 `chan::Receiver` 阻塞空缓冲区

我想构建一个多生产者多消费者(MPMC)通道,其中包含不同的并发任务处理和生成数据。其中一些任务负责与文件系统或网络进行交互。

两个例子:

  • PrintOutput(String)将由记录器、控制台输出或 GUI 使用。

  • NewJson(String)将由记录器或解析器使用。

为了实现这一点,我选择chan了 MPMC 通道提供者和tokio系统来管理通道上每个侦听器的事件循环。

在阅读了tokio 网站上的示例后,我开始实施futures::stream::Streamfor 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在我的雷达上并且似乎是最成熟的演员模型板条箱,但它几乎完全缺乏文档。


到目前为止,这是我的实现:

我已经完成了一个快速测试,看看它是如何工作的。看起来不错,但正如预期的那样,在完成缓冲区后会阻塞。虽然这应该可行,但我有点担心消费者“行为不端”意味着什么。现在我将继续测试这种方法,希望我不会遇到不良行为。

0 投票
1 回答
151 浏览

request - 如何在 Rust 中使用 tokio_proto 和 tokio_service 流式传输消息

在我的SmtpService情况下,我想在处理完成后立即发送响应头和正文。这应该遵循 SMTP 交换:

我在操场上有这么多:

我想知道是否有可能,或者我是否需要生成两条消息——一条用于 DATA,另一条用于实际字节流?

我得到的错误显示消息结构不匹配;身体/未来显然不合适: