问题标签 [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::run futures 中编写测试断言?
您如何测试打算在 Tokio 运行时运行的期货?
未来运行,未来的线程在assert
. 您可以在控制台中阅读恐慌,但test
无法识别tokio::run
.
我如何测试绑定到 tokio TcpStream 的未来?没有回答这个问题,因为它只是说:测试异步代码的简单方法可能是为每个测试使用专用运行时
我这样做!
我的问题与测试如何检测未来是否有效有关。未来需要一个启动的运行时环境。
尽管 future 断言或调用 err(),但测试成功。
那么我能做什么呢?
rust - 改进 Rust 的 Future 以不创建单独的线程
我根据本教程编写了一个简单的未来,如下所示:
所以问题是我如何pub fn run(&mut self, task: task::Task)
用不会创建新线程以供将来解决的东西替换。如果有人可以在run
没有单独线程的情况下用替换函数重写我的代码,这将有助于我理解事情应该如何。我也知道tokio
有一个超时实现,但我需要这个代码来学习。
rust - 带有类型问题的 Future 和 Stream 嵌套
我想使用一个返回 a 的未来,Vec<String>
在未来流中迭代它并将值提供给另一个未来,并且应该处理这个未来的结果。完整的东西也应该是未来。
怎么走?我尝试了不同的方法,但我遇到了类型问题,我不明白。
为什么会有这些嵌套的未来结果类型签名?这不应该成为最终的结果吗?为什么编译器不知道类型?
我为此设置了一个游乐场
rust - 根据初始未来结果有条件地链接 Rust 未来?
如果我有一些要链接在一起的期货,我怎样才能使第二个链接的未来以第一个未来的结果为条件?
对于一个人为的例子,我有类似的东西:
然后,我如何才能将未来更改为以add_one_then_double
未来的结果为条件add_one
,例如:
concurrency - 为什么 `futures::channel::mpsc` 只能通知一个发送者?
我正在阅读futures-preview
0.3 的来源,以了解如何正确地“通知任何人”。在mpsc::channel
(有界)中,多个发件人可能会等待收据(在缓冲区已满的情况下)。
查看 and 的实现next_message
,unpark_one
接收者似乎只通知一个发送者每一张收据。
我怀疑这是否适用于select!
,因为select!
可能会导致错误通知。但是,我无法提出问题案例。
这是我试图混淆的尝试mpsc
:
和这个:
我希望这会发生:
- 缓冲区由 填充
-1
。因此,后来的发件人被阻止。 - 有“真服务员”和“假服务员”之分。假服务员已经退出,因为另一只手
select!
立刻完成。 - 在对 的每次调用中
await!(recv.next())
,最多通知一个等待的发件人。如果通知了虚假的服务员,即使缓冲区有空房间,也没有人可以推送到缓冲区。 - 如果所有元素都在没有真正通知的情况下耗尽,整个系统就会卡住。
尽管我的期望,main2
异步功能成功完成。为什么?
async-await - 在特定线程中运行异步函数
我想在单独的线程上运行特定的长时间运行的函数(执行数据库查询)。但是,让我们假设底层数据库引擎一次只允许一个连接,而连接结构不允许Sync
(我认为至少后者是正确的diesel
)。
我的解决方案是有一个单独的线程(而不是线程池),所有数据库工作都在其中发生,并且只要主线程还活着,它就会运行。我想我知道如何通过通道传递消息来做到这一点,但这需要相当多的样板代码(例如,通过通道显式发送函数参数等)。
有没有一种更直接的方法可以用 rust 实现这样的事情(可能还有 tokio 和 nightly 中的新 async/await 表示法)?
我希望按照以下方式做一些事情:
wherequery_function
将是一个立即返回未来并在另一个线程上完成工作的函数。
Rust nightly 和外部 crates / 宏就可以了。
rust - How can I implement a blocking queue mechanism with futures::sync::mpsc::channel?
I am trying to understand how futures::sync::mpsc::Receiver
works. In the below example, the receiver thread sleeps for two seconds and the sender sends every second.
I expect that the sender will need to be blocked because of the wait and then send when the buffer is released.
What I see instead is that it is deadlocked after a time. Increasing the buffer of the channel only extends the time until it is blocked.
What should I do to make the sender send data when the buffer is available and put some backpressure to the sender in such cases? futures::sync::mpsc::channel
has its own documentation, but I do not understand how to use it properly.
rust - 什么是获得解决未来需要多长时间的干净方法?
我正在与 Tokio 一起做一些 UDP 的事情。
我想记录我的 UDP 探测未来解决的时间量。我想出了以下函数,time_future()
来包装未来并给我结果和持续时间。这个函数看起来很幼稚,我认为 Rust 有能力更清晰地表达这个概念。
我的工作代码(游乐场):
我该如何改进这一点并使其更惯用?我可以以某种方式让界面与inspect()
or类似地工作then()
吗?
我尝试创建一个Timed
trait 并实现它,Future
但我对自己的实现方式完全没有信心。这些类型真的让我陷入了循环。
我至少在吠叫正确的树吗?
async-await - 为什么`Box` 在使用 Tokio 和实验性 async/await 支持时不实现 `Sink` 特性?
我正在玩 async/await,方法是使用 Tokio 并在我的Cargo.toml
(以及最新的 Rust nightly 2018 版)中启用了 async/await 功能:
我遇到了一个我不明白的错误,在这个最小的例子中重现:
错误是:
如果我删除以“等待!”开头的行,它就会消失。
Box<dyn Sink>
在没有实验性 async/await 支持的情况下使用 Tokio 时,我的程序对 a是 a的想法很满意Sink
,所以我不确定为什么使用 async/await 的东西会出现错误。
错误是什么意思?我怎样才能解决这个问题?
rust - 使用 hyper 将块流异步写入文件
我正在尝试创建一个简单的函数,使用 hyper 将远程文件下载到本地文件路径。我也需要文件写入是异步的(在我的情况下,我正在使用tokio_fs
它)。这是代码:
但是,我收到以下错误:
从概念上讲,我理解错误的含义:由于 aFnMut
通过可变引用捕获变量,我无法移动捕获的变量。但是,我不明白如何在给出的示例中解决这个问题,因为我需要将流写入Join
未来返回的文件。
write_all
来自trait的方法在Write
这里可以工作,因为它将文件作为可变引用,但问题是它在同一个线程上进行写入。