问题标签 [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 投票
1 回答
906 浏览

rust - 你如何在 tokio::run futures 中编写测试断言?

您如何测试打算在 Tokio 运行时运行的期货?

未来运行,未来的线程在assert. 您可以在控制台中阅读恐慌,但test无法识别tokio::run.

如何测试绑定到 tokio TcpStream 的未来?没有回答这个问题,因为它只是说:测试异步代码的简单方法可能是为每个测试使用专用运行时

我这样做!

我的问题与测试如何检测未来是否有效有关。未来需要一个启动的运行时环境。

尽管 future 断言或调用 err(),但测试成功。

那么我能做什么呢?

0 投票
1 回答
1200 浏览

rust - 改进 Rust 的 Future 以不创建单独的线程

我根据本教程编写了一个简单的未来,如下所示:

所以问题是我如何pub fn run(&mut self, task: task::Task)用不会创建新线程以供将来解决的东西替换。如果有人可以在run没有单独线程的情况下用替换函数重写我的代码,这将有助于我理解事情应该如何。我也知道tokio有一个超时实现,但我需要这个代码来学习。

0 投票
1 回答
396 浏览

rust - 带有类型问题的 Future 和 Stream 嵌套

我想使用一个返回 a 的未来,Vec<String>在未来流中迭代它并将值提供给另一个未来,并且应该处理这个未来的结果。完整的东西也应该是未来。

怎么走?我尝试了不同的方法,但我遇到了类型问题,我不明白。

为什么会有这些嵌套的未来结果类型签名?这不应该成为最终的结果吗?为什么编译器不知道类型?

我为此设置了一个游乐场

0 投票
1 回答
1266 浏览

rust - 根据初始未来结果有条件地链接 Rust 未来?

如果我有一些要链接在一起的期货,我怎样才能使第二个链接的未来以第一个未来的结果为条件?

对于一个人为的例子,我有类似的东西:

然后,我如何才能将未来更改为以add_one_then_double未来的结果为条件add_one,例如:

0 投票
2 回答
1029 浏览

concurrency - 为什么 `futures::channel::mpsc` 只能通知一个发送者?

我正在阅读futures-preview0.3 的来源,以了解如何正确地“通知任何人”。在mpsc::channel(有界)中,多个发件人可能会等待收据(在缓冲区已满的情况下)。

查看 and 的实现next_messageunpark_one接收者似乎只通知一个发送者每一张收据。

我怀疑这是否适用于select!,因为select!可能会导致错误通知。但是,我无法提出问题案例。

这是我试图混淆的尝试mpsc

和这个:

我希望这会发生:

  1. 缓冲区由 填充-1。因此,后来的发件人被阻止。
  2. 有“真服务员”和“假服务员”之分。假服务员已经退出,因为另一只手select! 立刻完成。
  3. 在对 的每次调用中await!(recv.next()),最多通知一个等待的发件人。如果通知了虚假的服务员,即使缓冲区有空房间,也没有人可以推送到缓冲区。
  4. 如果所有元素都在没有真正通知的情况下耗尽,整个系统就会卡住。

尽管我的期望,main2异步功能成功完成。为什么?

0 投票
1 回答
1293 浏览

async-await - 在特定线程中运行异步函数

我想在单独的线程上运行特定的长时间运行的函数(执行数据库查询)。但是,让我们假设底层数据库引擎一次只允许一个连接,而连接结构不允许Sync(我认为至少后者是正确的diesel)。

我的解决方案是有一个单独的线程(而不是线程池),所有数据库工作都在其中发生,并且只要主线程还活着,它就会运行。我想我知道如何通过通道传递消息来做到这一点,但这需要相当多的样板代码(例如,通过通道显式发送函数参数等)。

有没有一种更直接的方法可以用 rust 实现这样的事情(可能还有 tokio 和 nightly 中的新 async/await 表示法)?

我希望按照以下方式做一些事情:

wherequery_function将是一个立即返回未来并在另一个线程上完成工作的函数。

Rust nightly 和外部 crates / 宏就可以了。

0 投票
1 回答
987 浏览

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.

0 投票
2 回答
426 浏览

rust - 什么是获得解决未来需要多长时间的干净方法?

我正在与 Tokio 一起做一些 UDP 的事情。

我想记录我的 UDP 探测未来解决的时间量。我想出了以下函数,time_future()来包装未来并给我结果和持续时间。这个函数看起来很幼稚,我认为 Rust 有能力更清晰地表达这个概念。

我的工作代码(游乐场):

我该如何改进这一点并使其更惯用?我可以以某种方式让界面与inspect()or类似地工作then()吗?

我尝试创建一个Timedtrait 并实现它,Future但我对自己的实现方式完全没有信心。这些类型真的让我陷入了循环。

我至少在吠叫正确的树吗?

0 投票
1 回答
359 浏览

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 的东西会出现错误。

错误是什么意思?我怎样才能解决这个问题?

0 投票
1 回答
1615 浏览

rust - 使用 hyper 将块流异步写入文件

我正在尝试创建一个简单的函数,使用 hyper 将远程文件下载到本地文件路径。我也需要文件写入是异步的(在我的情况下,我正在使用tokio_fs它)。这是代码:

在操场上观看

但是,我收到以下错误:

从概念上讲,我理解错误的含义:由于 aFnMut通过可变引用捕获变量,我无法移动捕获的变量。但是,我不明白如何在给出的示例中解决这个问题,因为我需要将流写入Join未来返回的文件。

write_all来自trait的方法在Write这里可以工作,因为它将文件作为可变引用,但问题是它在同一个线程上进行写入。