问题标签 [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 运行时上下文中从异步方法调用的非异步方法中等待未来?
我正在使用 Tokio 1.1 来做异步事情。我有一个async
main
with#[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
。有没有一种我想念的简单方法来做到这一点?
asynchronous - 如何使用 indicatif 在异步 Rust 中显示总计数器栏?
我尝试使用“indicatif”包来显示几个子任务的进度条以及一个计算所有已完成任务的进度条。我的代码是异步的并使用 tokio。这是一个例子:
货物.toml
src/main.rs
total_pb
是计算所有已完成任务的条形图。
问题是在所有工作已经完成之前,控制台上不会出现任何进度条,只向我显示它们的最终状态。我尝试遵循issue1和issue2中的建议,但有两个问题:
- 我尝试
let m = tokio::task::spawn_blocking(move || m.join().unwrap());
按照上面的代码插入,但它不起作用; total_pb
在所有任务完成之前不会完成,这意味着m.join()
不能在每个生成的任务之后立即调用作为问题 1 中建议的同步。
如果相关,我在 Windows 10 上。
rust - future.then() 如何返回 Future?
下面的函数,取自这里:
应该返回一个Future
. 但是,它返回的返回结果
这是在哪里.then
:
哪个不是Future
. 这怎么可能?
我试图了解此函数返回的内容。这是'.then'的结尾:
看起来它返回Either::Right(Either::Right
了一些东西。我很困惑。
asynchronous - 直接使用 Future 或包装在异步移动块中的区别
我想知道为什么将代码从Future
直接使用更改tokio::spawn
为使用async move
块可以编译代码。
直接使用:
异步块:
请注意以下事项use
:
直接使用代码失败并显示:
的返回类型与函数client_thread
完全相同main
,但是,在 Tokio 上运行没有任何问题。此外,来自implements的错误类型reqwest
Send
。
http - 错误:在 tokio 中找不到 main 或 io,无效的返回类型`impl Future`
我正在从 ML 家族转换到 Rust,但我发现在一些我不习惯遇到问题的奇怪地方很难。
我正在尝试使用hyper
http 处理,但似乎无法开始tokio
工作。
我试图复制粘贴这个例子:
这是我的Cargo.toml
:
它抱怨找不到io
箱子,并且main
类型无效,并且在以下位置impl Future
找不到:main
tokio
是#[tokio::main]
不是client
在超?
asynchronous - 如何通过具有完全所有权的内部`async fn func(mut self)`方法实现`Futures::poll`?
如何实现Futures::poll
以下将调用async
具有完全所有权的方法的代码self
?
如果需要,游乐场。
rust - 具有自有值的 Rust 块方法?
我正在尝试一次对几块字符串执行并行操作,但我发现借用检查器存在问题:
(对于上下文,来自 CSV 文件,identifiers
是reqwest 并且是一次写入多次读取)Vec<String>
client
target
Arc<String>
给定块产生一个 Vec<&[String]>,编译器抱怨它的identifiers
寿命不够长,因为它可能会在引用切片时超出范围。实际上这不会发生,因为有一个等待。有没有办法告诉编译器这是安全的,或者是否有另一种方法可以将块作为每个线程的一组拥有的字符串?
有一个类似的问题使用 into_owned() 作为解决方案,但是当我尝试这样做时,rustc 抱怨在 request_user 函数中编译时不知道切片大小。
编辑:还有一些其他问题:
是否有更直接的方式
target
在每个线程中使用而不需要 Arc?从创建的那一刻起,它就不需要修改,只需读取即可。如果没有,有没有办法将它从不需要 .as_str() 方法的 Arc 中拉出来?您如何处理 tokio::spawn() 块中的多种错误类型?在实际使用中,我将在其中收到 quick_xml::Error 和 reqwest::Error 。它可以在没有 tokio spawn 的情况下正常工作。
rust - 在 Rust tokio 代码中传播恐慌的推荐方法是什么?
现在我的恐慌正在被吞噬。在我的用例中,我希望它使整个程序崩溃并打印堆栈跟踪。我应该如何配置它?
loops - 如何使用 Tokio 在每个周期或间隔以秒为单位触发一个功能?
在 Node.js 中,我可以设置触发某个事件的时间间隔,
然而,Tokio间隔的界面有点复杂。这似乎与间隔的更字面定义有关,而不是按间隔调用函数,它只是暂停线程直到时间过去(使用.await
)。
Tokio 中是否有一个“每 x 秒”或类似调用函数的原语?如果没有,是否已经出现了一个成语来做到这一点?
我只需要定期运行一个函数......我也不关心其他线程。这只是 Tokio 事件循环中的一项功能。