Asynchronous 我应该在铁锈中等待吗?

Asynchronous 我应该在铁锈中等待吗?,asynchronous,rust,Asynchronous,Rust,在JavaScript中,异步代码是用承诺和类似Rust的async/await语法编写的。当可以简单地返回承诺时(即,当异步函数作为另一个函数中的最后一项执行时),返回并等待承诺通常被认为是多余的(因此不鼓励): 异步函数myFn(){/*…*/} 异步函数myFn2(){ //做安装工作 返回等待myFn() //^当我们可以归还承诺时,这是不必要的 } 我想知道类似的模式是否适用于生锈。我应该更喜欢这个: pub async fn my_函数( &莫特·赛尔夫, )->结果{ //进行同

在JavaScript中,异步代码是用承诺和类似Rust的
async
/
await
语法编写的。当可以简单地返回承诺时(即,当异步函数作为另一个函数中的最后一项执行时),返回并等待承诺通常被认为是多余的(因此不鼓励):

异步函数myFn(){/*…*/} 异步函数myFn2(){ //做安装工作 返回等待myFn() //^当我们可以归还承诺时,这是不必要的 } 我想知道类似的模式是否适用于生锈。我应该更喜欢这个:

pub async fn my_函数(
&莫特·赛尔夫,
)->结果{
//进行同步设置工作
self.exec_命令(
/* ... */
)
.等待
}
或者这个:

pub fn my_函数(
&莫特·赛尔夫,
)->impl未来{
//进行同步设置工作
self.exec_命令(
/* ... */
)
}

前者对我来说更符合人体工程学,但我怀疑后者可能更具性能。是这样吗?

两者之间没有真正的区别,因为async只是解析为
impl Future
。我不认为两者之间有任何有意义的性能差异,至少在我对两者的经验使用上是如此


如果你是要求在风格上的偏好,那么在我看来第一个是首选的,因为类型对我来说更清晰,我同意它更符合人体工程学

两个变体之间的一个语义差异是,在第一个变体中,同步设置代码将仅在等待返回的未来时运行,而在第二个变体中,它将在调用函数后立即运行:

设fut=x.my_函数();
//在第二个变体中,同步设置现在已经完成
...
让val=fut.wait;//在第一个变体中,它在这里运行
为了让差异变得明显,同步设置代码必须有副作用,并且在调用异步函数和等待它返回的未来之间需要有一个延迟


除非您有特定的理由立即执行前导,否则请使用异步函数,即第一个变量。它使函数更容易预测,并且在函数重构后更容易添加更多等待。

我希望两者编译为相同的代码,所以我尝试了godbolt。当我打开这两个函数时,它们都是相同的,但大部分是空的(并且看起来不再是异步的(?),当我打开它们时,它们之间存在差异,但我无法判断它们在实际代码中的优化程度……我认为
async fn
添加了一些自动特性(如
Send
Unpin
),如果可能的话。您自己返回
impl Future
意味着您有责任在返回类型中跟踪它。无论哪种方式,我都希望它们在发布模式下生成相同的程序集。@Jmb,这很有趣。如果我编写代码,那么使用
impl Future
的版本似乎会生成更多的指令。另请参见