Rust Async 2- 同步、多線程、異步的例子

一、同步例子:

這個例子中,main 函數按順序調用 read_file1() 和 read_file2() 函數,並打印返回的內容和相關信息。

Read_file1() 函數會先睡眠 4 秒,然後返回內容;

Read_file2() 函數會先睡眠 2 秒,然後返回內容。

執行程序:

    可以看到程序執行後等待 4 秒後打印出了 file 1 的內容,又過了 2 秒纔打印出 file 2 的內容。一共需要花費 6 秒鐘,而我們應該可以做得更好。

二、多線程併發的例子

    這次,我們爲兩個函數調用分別建立了一個系統線程。這次運行的速度快多了,大約在 4 秒多。下面我們再使用異步的方式實現一下。

三、異步的例子

想要用 Rust 編寫異步的程序,Rust 標準庫只提供了一些基本的東西,這是不夠的,我們需要使用第三方庫。本例中,我們使用 tokio 這個異步運行時。

首先在 Cargo.toml 裏添加 tokio 的依賴:

    程序代碼如下:

    首先,main 函數前面加了 async。而且在上面加了#[tokio::main] 這個註解,這會告訴編譯器使用 tokio 作爲異步運行時,這部分功能我們會在後續的文章裏介紹。

    read_file1() 和 read_file2() 兩個函數簽名的前面加上了 async,這時他們就可以變成由 tokio 運行時安排的異步任務了。

    在第 7 和第 10 行,使用了類似創建線程的方式分別創建了兩個異步任務,由 tokio 進行管理。而任務到底運行在當前線程還是其他線程,這依賴於 tokio 運行時的配置。

    最後第 13 行,在 main 函數結束前,join! 宏會等待兩個任務結束。

    讓我們看看執行結果:

只打印出這一句話,說明 read_file1() 和 read_file2() 兩個函數並沒有執行。這是因爲,這兩個函數現在變成了異步函數,而異步函數是惰性的,只有遇到.await 關鍵字纔會執行。所以修改程序代碼,添加 await 關鍵字:

看一下執行結果:

可以看到,這兩個任務是併發執行的,這和前面的多線程類似。但不同的是這兩個任務可執行在同一個線程或單獨的線程,這依賴於 tokio 運行時的配置。

此外,也可以看到 read_file2() 在 read_file1() 完成執行,這是因爲 read_file2() 睡了 2 秒而 read_file1() 睡了 4 秒。所以儘管 read_file1() 的任務先生成,但異步運行時先執行的是 read_file2(),因爲它會更早的喚醒。

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/8awM1Nbc0HMUI0Xdt1ItvQ