Async-await 在Rust中穩定了!


在這個星期四,11月7日,作爲1.39.0版本的一部分,async-await語法穩定了。這項工作已經進行了很長的時間,例如其中的關鍵思想零開銷,首先由Aaron Turon和Alex Crichton在2016年提出的,我們爲這個結果感到自豪。我們相信異步I/O將成爲Rust中越來越重要的一部分。

儘管第一次發行穩定的"async-await"是一個重大事件,但這也僅僅是開始。當前對async-await的支持是一種“最小可行產品”(MVP)。我們預計將在一段時間內對其進行打磨、改進和擴展。

async-await進入測試版本以來,我們已經取得了很大的進步,包括進行了一些重要的診斷改進,這些改進有助於使async-await的錯誤更易理解。要參與這項工作,請查看Async Foundations Working Group;您也可以幫助我們歸類整理問題或提名最需要解決的問題來指導我們的工作。

非常感謝使async-await得以實現的人們。這些設計和實現離不開cramertj和withoutboats的領導、編譯器方面的實現和完善工作(davidtwco,tmandry,gilescope,csmoe)、核心生成器的支持(Zoxc)、FuturePin API的基礎工作(aturon,alexcrichton,RalfJ,pythonesque),當然還有許多社區成員在RFC和討論中提供的信息。

異步生態系統的主要進展

現在,async-await接近穩定,所有主要的異步I/O運行時都在添加和擴展對新語法的支持:

  • tokio最近宣佈了一些調度程序方面的改進,他們計劃在11月發佈一個穩定版本,該版本支持async-await語法;
  • async-std在過去的幾個月中每週發佈一個版本,並計劃在async-await達到穩定後發佈其1.0版發佈。
  • 使用wasm-bindgen-futures,您甚至可以將Rust Futures與JavaScript Promise連接起來;
  • hyper library已遷移爲採用標準Rust futures;
  • 新發布的future-rs庫的0.3.0版本包括對async-await的支持;
  • 最後,async-await支持也開始在更高級別的Web框架以及諸如futures_intrusive crate之類的其他程序中可用。

Async-await:快速入門

(本節和之後的部分摘自_“Async-await hits beta!” _一文。)

那麼,異步等待是什麼?異步等待是一種編寫函數(function)的方法,可以“暫停”函數,將控制權返回給運行時,隨後可以從中斷處重新開始。通常,這些暫停是爲了等待I/O,但也有多種其它的用途。

您可能熟悉JavaScript或C#中的async-await。Rust版本的與其功能相似,但有一些主要區別。

要使用async-await,首先要編寫async fn而不是fn:

async fn first_function()-> u32 { .. }

與常規函數不同,調用async fn不會立即生效。而是返回一個Future。這是一個等待執行的暫緩操作。要實際執行future, 使用.await操作符:

async fn another_function() { 
    // Create the future: 
    let future = first_function(); 
    
    // Await the future, which will execute it (and suspend 
    // this function if we encounter a need to wait for I/O): 
    let result: u32 = future.await; 
    ... 
}

這個例子顯示了Rust與其他語言之間的第一個區別:我們編寫的是future.await而不是await future。該語法與Rust中傳播錯誤的?操作符集成得更好(在I/O中非常常見)。您可以簡單地寫future.await?等待future的結果並傳播錯誤。它還具有使方法鏈接變得更順暢的優勢。

零開銷future

Rust的future與JS和C#中的future之間的另一個區別是,它基於“poll”模型,這使它是零開銷的。在其他語言中,調用異步函數會立即創建一個future,並安排其執行時間:執行future不需要等待future。但這意味着創建的每個將來都會有一些開銷。

相反,在Rust中,調用異步函數本身並不會進行任何調度,這意味着我們可以組成一個複雜的future嵌套,而不會產生單個future的開銷。作爲最終用戶,你會發現future是惰性的:在你await它之前,它什麼都不做。

如果您想進一步瞭解future的幕後運作方式,請查看async bookexecutor部分,或觀看withoutboats在Rust LATAM 2019上就該主題進行的精彩演講

總結

我們相信,async-await進入Rust穩定版將成爲Rust中許多新的令人振奮的開發的關鍵推動力。 如果您過去在Rust中嘗試過異步I/O並遇到了問題-特別是如果你嘗試了過去基於combinator的future,你會發現async-await與Rust的借用系統集成得更好。 此外,現在生態系統中有許多出色的運行時庫和其他庫可供使用。行動起來,構建一些東西吧!

原文:https://blog.rust-lang.org/2019/11/07/Async-await-stable.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章