问题标签 [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.
asynchronous - 从 tokio 套接字反序列化
我正在使用 tokio 来实现一个服务器,该服务器与使用 serde(bincode)序列化的消息进行通信。如果没有异步和期货,我会做
但我需要的是一个decode
可以与异步套接字一起使用的函数
我唯一的想法是在编码期间手动将长度写入缓冲区,然后使用 read_exact:
有没有更好的方法来实现解码?
asynchronous - 如何在期货流中为每个项目发出 TcpClient 请求?
我有一个概念项目,其中客户端向服务器发送一个数字(PrimeClientRequest
),服务器计算该值是否为素数,并返回一个响应(PrimeClientResponse
)。我希望客户端是一个简单的 CLI,它提示用户输入一个数字,将请求发送到服务器,并显示响应。理想情况下,我想使用TcpClient
来自 Tokio 和来自 Futures-Rs 的 Streams 来做到这一点。
我已经使用服务编写了一个 Tokio 服务器,我想为客户端重用codec
它proto
。
客户端的一部分是一个被调用的函数read_prompt
,它返回一个Stream
. 本质上,它是一个无限循环,每次迭代都会从stdin
.
以下是相关代码:
main.rs
cli.rs
使用上面的代码,客户端在客户端终止之前向服务器发送一个请求。我希望能够使用生成的流向流中的每个项目read_prompt
提供输入TcpClient
并发出请求。我该怎么做呢?
完整的代码可以在joshleeb/tokio-prime找到。
asynchronous - 从 UdpSocket 异步读取
我正在尝试同时处理 Tokio 中到达的 UDP 数据包。但是,以下 MWE 并没有达到我的预期:
连接两个终端$ nc -u localhost 8080
并发送一些文本,我可以看到来自第二个终端的消息在第一个终端完成后处理。
我必须改变什么?
asynchronous - 如果某些情况发生,则完成未来
如果通过 UDP 连接接收到某个值,我想创建一个完成的未来。
澄清一下,假设我发送一个 id 为 2 的 ping 并希望异步等待具有相同 id 的 pong。我的想法是使用类似的东西send_ping(endpoint, id) -> Future
并与未来一起工作(例如将其传递给其他函数),知道它要么解析为匹配的 pong 要么解析为超时。
我的想法的草图:
这甚至可能吗?我找不到任何例子。
rust - 东京回声服务器。不能在同一个未来读写
我正在尝试在 Tokio 中构建一个回显服务器。我见过一些例子,但它们似乎都使用io::copy
了 Tokio IO,我不能使用,因为我想修改输出。
但是,我无法编译同时使用writer
和的服务器reader
。我想构建一个基于期货的任务,该任务可以循环读取/写入(回显服务器)。
我的实际代码是这样的:
您可能会说我必须使用Arc
,因为涉及不同的线程。我已经尝试过Arc
and Mutex
,但是出现了另一个错误,我想不出办法让它编译:
它说的错误是:cannot move out of borrowed content
stream - 如何从流本身中取消无限流?
我试图interval_timer
在清空队列后取消间隔(),但不确定什么是正确的策略。
我drop
按照 gitter 中的建议进行了尝试,但最终出现错误:
错误:
asynchronous - 如何异步读取子进程输出
我想实现一个futures::Stream
用于读取和解析子子进程的标准输出的方法。
我现在在做什么:
生成子进程并通过
std::process
方法获取其标准输出:let child = Command::new(...).stdout(Stdio.pipe()).spawn().expect(...)
添加
/li>AsyncRead
和BufRead
到标准输出:为标准输出声明一个包装结构:
/li>实施
/li>Stream
:
问题是它AllowStdIo
不会ChildStdout
神奇地异步并且self.io.read_line
调用仍然阻塞。
我想我需要传递一些不同的东西而不是Stdio::pipe()
让它异步,但是什么?或者有不同的解决方案吗?
这个问题不同于What is the best approach to 在 future-rs 中封装阻塞 I/O?因为我想为子进程的特定情况获取异步I/O,而不是解决同步I/O的封装问题。
更新:我正在使用tokio = "0.1.3"
它的运行时功能,目前使用tokio-process
不是一个选项(https://github.com/alexcrichton/tokio-process/issues/27)
rust - 如何在 Tokio 中安排重复任务?
我正在用使用 Tokio 的异步等效代码替换用 Rust 编写的同步套接字代码。Tokio 使用 futures 进行异步活动,因此任务被链接在一起并排队到执行程序上,以由线程池执行。
我想做的基本伪代码是这样的:
这个伪代码只会执行我的任务一次。我如何连续运行它?我希望它执行,然后一次又一次地执行等等。我只希望它在恐慌或有错误结果代码时停止执行。最简单的方法是什么?
rust - 如何在 #[no_std] 环境中使用 Tokio Reactor?
我正在尝试在 Tock OS 嵌入式操作系统上实现期货。我正在尝试在环境中使用Tokio 。#[no_std]
我的Cargo.toml
文件如下所示:
这编译没有错误,但是当我添加时tokio-reactor = "0.1.1"
,我得到了错误:error[E0463]: can't find crate for std
。我知道这是因为 Tokio 从 std 库中导入了一些东西。
有可能解决这个问题吗?