问题标签 [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 回答
5389 浏览

rust - 如何在 Tokio 运行时上下文中从异步方法调用的非异步方法中等待未来?

我正在使用 Tokio 1.1 来做异步事情。我有一个async mainwith#[tokio::main]所以我已经在运行一个运行时。

main调用我希望在未来使用的非异步方法await(具体来说,我正在从数据融合数据帧中收集)。这种非异步方法具有一个特征规定的签名,该特征返回一个结构,而不是一个Future<Struct>. 据我所知,我无法将其标记为异步。

如果我尝试打电话df.collect().await;,我会得到

只允许在async函数和块内部

来自编译器的错误,指出我在其中调用的方法await不是async.

如果我尝试block_on从这样的新运行时获得未来:

我得到一个运行时恐慌:

无法从运行时内启动运行时。发生这种情况是因为一个函数(如block_on)在线程被用于驱动异步任务时试图阻塞当前线程。

如果我尝试futures::executor::block_on(df.collect()).unwrap();,我会得到一个新的运行时恐慌:

“当前未在 Tokio 0.2.x 运行时上运行。”

这很奇怪,因为我使用的是 Tokio v1.1。

这感觉比它应该的更难。我在异步上下文中,感觉编译器应该知道这一点并允许我.await从方法内调用——唯一的代码路径从块内调用此方法async。有没有一种我想念的简单方法来做到这一点?

0 投票
1 回答
553 浏览

asynchronous - 如何使用 indicatif 在异步 Rust 中显示总计数器栏?

我尝试使用“indicatif”包来显示几个子任务的进度条以及一个计算所有已完成任务的进度条。我的代码是异步的并使用 tokio。这是一个例子:

货物.toml

src/main.rs

total_pb是计算所有已完成任务的条形图。

问题是在所有工作已经完成之前,控制台上不会出现任何进度条,只向我显示它们的最终状态。我尝试遵循issue1issue2中的建议,但有两个问题:

  1. 我尝试let m = tokio::task::spawn_blocking(move || m.join().unwrap());按照上面的代码插入,但它不起作用;
  2. total_pb在所有任务完成之前不会完成,这意味着m.join()不能在每个生成的任务之后立即调用作为问题 1 中建议的同步。

如果相关,我在 Windows 10 上。

0 投票
1 回答
124 浏览

rust - future.then() 如何返回 Future?

下面的函数,取自这里

应该返回一个Future. 但是,它返回的返回结果

这是在哪里.then

哪个不是Future. 这怎么可能?

我试图了解此函数返回的内容。这是'.then'的结尾:

看起来它返回Either::Right(Either::Right了一些东西。我很困惑。

0 投票
1 回答
264 浏览

asynchronous - 直接使用 Future 或包装在异步移动块中的区别

我想知道为什么将代码从Future直接使用更改tokio::spawn为使用async move块可以编译代码。

直接使用:

异步块:

请注意以下事项use

直接使用代码失败并显示:

的返回类型与函数client_thread完全相同main,但是,在 Tokio 上运行没有任何问题。此外,来自implements的错误类型reqwestSend

0 投票
1 回答
687 浏览

http - 错误:在 tokio 中找不到 main 或 io,无效的返回类型`impl Future`

我正在从 ML 家族转换到 Rust,但我发现在一些我不习惯遇到问题的奇怪地方很难。

我正在尝试使用hyperhttp 处理,但似乎无法开始tokio工作。

我试图复制粘贴这个例子

这是我的Cargo.toml

它抱怨找不到io箱子,并且main类型无效,并且在以下位置impl Future找不到:maintokio

#[tokio::main]不是client在超?

0 投票
1 回答
42 浏览

asynchronous - 如何通过具有完全所有权的内部`async fn func(mut self)`方法实现`Futures::poll`?

如何实现Futures::poll以下将调用async具有完全所有权的方法的代码self

如果需要,游乐场。

0 投票
2 回答
595 浏览

rust - 具有自有值的 Rust 块方法?

我正在尝试一次对几块字符串执行并行操作,但我发现借用检查器存在问题:

(对于上下文,来自 CSV 文件,identifiers是reqwest 并且是一次写入多次读取)Vec<String>clienttargetArc<String>

操场:https ://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=e41c635e99e422fec8fc8a581c28c35e

给定块产生一个 Vec<&[String]>,编译器抱怨它的identifiers寿命不够长,因为它可能会在引用切片时超出范围。实际上这不会发生,因为有一个等待。有没有办法告诉编译器这是安全的,或者是否有另一种方法可以将块作为每个线程的一组拥有的字符串?

有一个类似的问题使用 into_owned() 作为解决方案,但是当我尝试这样做时,rustc 抱怨在 request_user 函数中编译时不知道切片大小。

编辑:还有一些其他问题:

  1. 是否有更直接的方式target在每个线程中使用而不需要 Arc?从创建的那一刻起,它就不需要修改,只需读取即可。如果没有,有没有办法将它从不需要 .as_str() 方法的 Arc 中拉出来?

  2. 您如何处理 tokio::spawn() 块中的多种错误类型?在实际使用中,我将在其中收到 quick_xml::Error 和 reqwest::Error 。它可以在没有 tokio spawn 的情况下正常工作。

0 投票
1 回答
969 浏览

rust - 在 Rust tokio 代码中传播恐慌的推荐方法是什么?

现在我的恐慌正在被吞噬。在我的用例中,我希望它使整个程序崩溃并打印堆栈跟踪。我应该如何配置它?

0 投票
1 回答
381 浏览

asynchronous - 如何创建 Tokio 计时器来消除网络数据包的接收抖动?

问题

我已经实现了一个函数,它从发送的数据包中返回一组缺失的索引。如果发送了 100 个数据包,那么服务器将有一个索引向量,索引为 0(缺失)和 1(未缺失)。我不想每次都触发这个,只有在没有收到数据包的情况下有轻微的延迟。我想将我的同步函数更改为异步去抖动函数

我尝试解决去抖动问题

我正在寻找一种解决方案来实现一个计时器(如 300 毫秒),它的值将不断被不同的线程覆盖。一旦它的值不再被覆盖,它应该触发一段代码或函数。我正在使用东京。

这是我想要实现的伪代码:


我的项目基于Tokio的以下示例:

0 投票
1 回答
2089 浏览

loops - 如何使用 Tokio 在每个周期或间隔以秒为单位触发一个功能?

在 Node.js 中,我可以设置触发某个事件的时间间隔,

然而,Tokio间隔的界面有点复杂。这似乎与间隔的更字面定义有关,而不是按间隔调用函数,它只是暂停线程直到时间过去(使用.await)。

Tokio 中是否有一个“每 x 秒”或类似调用函数的原语?如果没有,是否已经出现了一个成语来做到这一点?

我只需要定期运行一个函数......我也不关心其他线程。这只是 Tokio 事件循环中的一项功能。