问题标签 [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.
rust - 为什么在使用 Tokio 的 frame_delimited 时会出现 FrameTooBig 错误?
我正试图用 Tokio 弄湿我的脚。当我从 Telnet 连接发送消息时,我得到Custom { kind: InvalidData, error: FrameTooBig }
. 我不明白这个问题,也不知道如何克服它。
客户端:
multithreading - 是否可以在当前线程中对 Tokio 的当前线程进行工作?
我想在foo
执行器内部生成一个任务current_thread
:
当我运行它时,它失败了:
我尝试传递current_thread
给foo
但无法编译。是否有可能做到这一点,如果可以,怎么做?
rust - 如何使用 tokio 的 UdpSocket 处理 1 个服务器中的消息:N 个客户端设置?
我想做的事:
...编写一个(1)个服务器/(N)个客户端(网络游戏)架构,它使用 UDP 套接字作为通信的底层基础。
消息发送为,通过(crate)
Vec<u8>
编码bincode
我还希望能够偶尔发送可能超过
MTU
~ 的典型最大值的数据报,1500 bytes
并在接收端正确组装,包括发送ack
-messages 等。(我假设我必须自己实现,对吧?)
对于UdpSocket
我想过使用tokio
的实现,也许framed
。我不确定这是否是一个不错的选择,因为这似乎会引入一个不必要的映射步骤Vec<u8>
(由 序列化bincode
)到Vec<u8>
(由 需要UdpCodec
)tokio
(?)
考虑这个最小的代码示例:
Cargo.toml (服务器)
(Serde
并且serde-derive
用于shared
定义协议的 crate 中!)
(我想尽快tokio-core
更换tokio
)
这里的问题是:
let udp_future = socket.framed(MyCodec {}).for_each(|(addr, data)| { | ------ 移到这里的值 ^^^^^^^^^^^^^ 之后捕获到这里的值move | = 注意: move 发生是因为
socket
有 typetokio_core::net::UdpSocket
,它没有实现Copy
trait
该错误完全有道理,但我不确定如何创建如此简单的回显服务。实际上,消息的处理涉及到更多的逻辑,但为了一个最小的例子,这应该足以给出一个粗略的想法。
我的解决方法是一个丑陋的黑客:创建第二个套接字。
asynchronous - 使用 Rust 期货运行异步可变操作
我正在使用 tokio-rs 在 Rust 中构建一个服务,并且到目前为止对这个技术堆栈很满意。我现在正在尝试链接包括写入在内的异步操作,并且很难使用借用检查器。
我简化的最小代码示例是这样的:
作为一个简短的总结,在异步准备步骤之后,我尝试运行另一个异步操作,该操作写入self
. 如果没有可变性,这很容易与普通Rc
成员一起使用,但可变性会破坏它,产生以下错误:
我希望这应该可行,我看不到可变引用仍然在哪里借用。我认为process()
应该在返回未来后释放处理器&mut self
,所以不应该发生编译错误。
你能解释一下根本原因吗?这个例子应该如何改变才能被编译器接受?
rust - 如何向 tokio-io 添加特殊的 NotReady 逻辑?
我正在尝试制作一个Stream
等到特定字符在缓冲区中的情况。我知道有read_until()
,BufRead
但我实际上需要一个自定义解决方案,因为这是实现等待直到缓冲区中的特定字符串(或者,例如,发生正则表达式匹配)的垫脚石。
在我第一次遇到问题的项目中,问题是当我Ready(_)
从内部未来得到一个并NotReady
从我的函数返回时,未来的处理只是挂起。我发现我不应该按照文档(最后一段)这样做。但是,我没有得到的是那段中承诺的实际替代方案。我阅读了 Tokio 网站上所有已发布的文档,目前对我来说没有意义。
所以以下是我当前的代码。不幸的是,我不能让它更简单更小,因为它已经坏了。目前的结果是这样的:
预期的结果是从中得到一些结果Ok(Ready(_))
,同时打印W
and W'
,并等待缓冲区中的特定字符。
rust - 尝试使用 Tokio 实现嵌套并发时“无法递归调用‘Core’”
我正在构建一个定期发出 HTTP 请求的服务。我tokio::timer::Delay
用作定期触发器和超级来进行 HTTP 调用。
一起使用它们会给我以下错误:
我怎样才能使这项工作?
以下是该服务的简化版本。
main.rs
货运.toml
rust - 如何使用 Tokio 从 TcpStream 读取单个数据包?
我正在尝试使用 tokio 接收单个数据包:
此代码打印一个空包。如何更改此代码以打印接收到的数据包?
rust - 在盒装的未来使用参考变量时“需要显式生命周期”
我正在尝试使用在中创建的结构main()
并将其传递给返回 boxed 的函数Future
。但是,我遇到了生命周期和借贷问题,似乎无法干净地解决这个问题。
这是我的结构和功能:
编译时出现以下错误:
我想发生错误是因为SomeStruct
在s 范围内Future
使用并且可能在main()
s 范围之外使用,因此编译器要求我将生存期更改为'static
. 这是我到目前为止尝试的(不成功):
- 将生命周期更改
'static
为编译器建议的,这会在main()
. val
按照编译器的建议添加移动ok(20).and_then(move |val| {
,这会在第二次调用get_future()
.- 使用lazy_static板条箱显式初始化
SomeStruct
为静态(如此处所建议的),但是我在尝试时遇到了宏错误。
整个例子可以在这里找到。我省略了一些细节来创建一个最小的例子。使用tokio-core
和会出现问题futures = "0.1"
。不幸的是,由于依赖另一个库,迁移到版本"0.2"
不是一种选择。
rust - 如何使用 reqwest 执行并行异步 HTTP GET 请求?
异步示例很有用,但作为 Rust 和 Tokio 的新手,我正在努力研究如何一次执行 N 个请求,使用来自向量的 URL,并为每个 URL 创建一个响应 HTML 的迭代器作为字符串。
怎么可能做到这一点?
rust - 在 Tokio 中向非线程安全的单例对象分派请求
我想围绕来自第三方库的对象创建一个包装器,然后通过 Tokio 将源自 TCP 套接字的请求分派给它。在 Tokio 有没有一种惯用的方法来处理这个问题?
从概念上讲,界面如下所示:
有几点需要注意:
- 该对象不是线程安全的,因此需要对请求进行序列化
- 请求处理程序可能需要很长时间,因此在与 Tokio 事件循环的其余部分相同的线程上运行它们可能不是一个好主意
我可以启动一个常规的操作系统线程并通过队列提供它,但在这种情况下,我需要将不同类型的请求多路复用到它上面(然后将响应多路分解回套接字)。是否有一些我可以重复使用的现有管道?
一个延伸目标是在它们之间有一个MyObject
s 池和负载平衡请求。