asynchronous - 为什么 async-std 的 task::spawn 会阻止后续代码行执行?
问题描述
我正在尝试使用异步标准task::spawn
:
use std::time::Duration;
async fn w() {
loop {
task::sleep(Duration::from_secs(1)).await;
println!("Tick");
}
}
#[async_std::main]
async fn main() {
println!("Start");
task::spawn(w()).await;
println!("End");
}
我希望在“开始”之后立即打印“结束”,但“滴答”循环会无休止地打印。
那么与下面的具体有什么区别呢?
#[async_std::main]
async fn main() {
println!("Start");
w().await;
println!("End");
}
解决方案
不要.await
生成任务。这样做就像加入一个线程:它在继续之前等待任务完成。spawn
无需等待句柄返回即可驱动任务完成。
task::spawn(w()).await;
如所写,您是正确的,task::spawn(w()).await
与w().await
. 他们都阻塞了等待w()
完成的线程。
那么等待生成呼叫的目的是什么?如果你想生成一个后台任务,在当前线程上做一些其他的工作,然后阻塞,这很有用。
let handle = task::spawn(w());
do_other_things_for_a_while();
// Block and retrieve the result.
let result = handle.await;
推荐阅读
- c++ - 模板模板函数未按预期推断参数
- mysql - 删除表中的一行mysql hiberhate
- sql - 在 SQL Google BigQuery 中计算 CASE
- c# - C# P/调用 | blittable 结构数组的编组行为不一致?
- java - 在 JAVA 和 Spring 中设计自定义工作流
- algorithm - 比例分配算法
- python-3.x - Python列表理解字典和OpenCV
- javascript - 单独编译 Angular 组件并在 HTML 页面中一起使用它们
- maven - nexus-staging-maven-plugin 在没有信息的情况下返回 401
- reactjs - React Native - 未定义不是一个对象(评估'singleValue.stopTracking')