Rust高效率非同步I/O模型
Rust生態系統已經提供快速產品化的非同步I/O模型,但是過於低階,需要自己狀態機與回撥函式。現在零消耗future模型開源專案:https://github.com/alexcrichton/futures-rs釋出了,該模型是高層次抽象,能夠進行組合,其實它類似於很多語言中的future模型或promise模型,主要加入一些async/await語法糖。
所謂零消耗抽象,也就是說,不會因為提高抽象層次導致過多冗餘程式碼,這個高層次抽象編譯後等同於狀態機+回撥函式,沒有過多其他輔助程式碼,從而保證了高層次程式碼與低層次程式碼同樣的執行效率。
非同步future模型可以實現一些任務:
1.資料庫查詢
這是線上程池中執行,當查詢完成後,future完成了,它的值就是查詢結果。
2.RPC呼叫伺服器,當伺服器響應後,future完成了,它的值就是伺服器響應
3.計時,當計時時間到,future完成,它的值就是計時完成返回函式
4.長時間CPU密集任務,執行線上程池,當任務完成時,future也完成,值就是任務返回值。
5.從socket讀取位元組,當位元組準備好後,future已經完成了,依賴緩衝策略,直接返回位元組。
Rust是將future作為一個trait介面:
下面是幾種不同future實現:
此外還可以使用future完成:Sequential組合;mapping;joining和selecting
使用future可以進行流處理組合:
為了驗證零消耗抽象的future模型的高效能,使用該模型編寫的簡單 minihttp伺服器與流行的最快幾個伺服器框架比較,包括:
1.rapidoid:這是一個java框架,上一輪是最高效能
2.Go語言,使用標準HTTP庫包
3.fasthttp是Go的標準HTTP競爭者
4.Node.js
效能從高到低結果是:minihttp(Rust)、rapidoid(Java)、fasthttp(Go)、Go和node.js.
所謂零消耗抽象,也就是說,不會因為提高抽象層次導致過多冗餘程式碼,這個高層次抽象編譯後等同於狀態機+回撥函式,沒有過多其他輔助程式碼,從而保證了高層次程式碼與低層次程式碼同樣的執行效率。
非同步future模型可以實現一些任務:
1.資料庫查詢
這是線上程池中執行,當查詢完成後,future完成了,它的值就是查詢結果。
2.RPC呼叫伺服器,當伺服器響應後,future完成了,它的值就是伺服器響應
3.計時,當計時時間到,future完成,它的值就是計時完成返回函式
4.長時間CPU密集任務,執行線上程池,當任務完成時,future也完成,值就是任務返回值。
5.從socket讀取位元組,當位元組準備好後,future已經完成了,依賴緩衝策略,直接返回位元組。
Rust是將future作為一個trait介面:
trait Future { type Item; // ... lots more elided ... } <p class="indent"> |
下面是幾種不同future實現:
// 根據id查詢表一行記錄,當完成查詢後yield返回該行 fn get_row(id: i32) -> impl Future<Item = Row>; // 進行RPC 呼叫,yield返回i32 fn id_rpc(server: &RpcServer) -> impl Future<Item = i32>; // 向TCP流寫入整個字串,當完成後yielding返回這個流。 fn write_string(socket: TcpStream, data: String) -> impl Future<Item = TcpStream>; <p class="indent"> |
此外還可以使用future完成:Sequential組合;mapping;joining和selecting
使用future可以進行流處理組合:
// 對於輸入I/O 物件建立一個請求流 let requests = ParseStream::new(input); // 對於每個請求,執行服務的`process`函式處理請求產生響應 let responses = requests.and_then(|req|service.process(req)); //建立新的future 將會把每個響應輸出到 I/O物件 StreamWriter::new(responses, output) <p class="indent"> |
為了驗證零消耗抽象的future模型的高效能,使用該模型編寫的簡單 minihttp伺服器與流行的最快幾個伺服器框架比較,包括:
1.rapidoid:這是一個java框架,上一輪是最高效能
2.Go語言,使用標準HTTP庫包
3.fasthttp是Go的標準HTTP競爭者
4.Node.js
效能從高到低結果是:minihttp(Rust)、rapidoid(Java)、fasthttp(Go)、Go和node.js.
原文:
相關文章
- socket阻塞與非阻塞,同步與非同步、I/O模型非同步模型
- 談談對不同I/O模型的理解 (阻塞/非阻塞IO,同步/非同步IO)模型非同步
- Java非阻塞I/O模型之NIO說明Java模型
- 計算機I/O與I/O模型計算機模型
- Java 非同步 I/OJava非同步
- 網路I/O模型模型
- python 非同步 I/OPython非同步
- NodeJs 非同步 I/ONodeJS非同步
- I/O阻塞與同步理解
- java 淺析I/O模型Java模型
- Python教程:精簡概述I/O模型與I/O操作Python模型
- 深入理解Java I/O模型Java模型
- I/O模型、Libuv和Eventloop模型OOP
- 網路I/O模型 解讀模型
- 作業系統—I/O 模型作業系統模型
- Java I/O 模型的演進Java模型
- Java NIO:淺析I/O模型Java模型
- nodejs筆記-非同步I/ONodeJS筆記非同步
- Linux libaio 非同步I/OLinuxAI非同步
- Java I/O模型及其底層原理Java模型
- Linux裡五種I/O模型Linux模型
- 系統程式設計 - I/O模型程式設計模型
- 從 I/O 模型到 Netty(二)模型Netty
- 從 I/O 模型到 Netty(一)模型Netty
- 從 I/O 模型到 Netty(三)模型Netty
- Java NIO1:I/O模型概述Java模型
- Java I/O流模型概念分析整理Java模型
- Linux下的5種I/O模型與3組I/O複用Linux模型
- Java NIO學習系列五:I/O模型Java模型
- Redis篇:單執行緒I/O模型Redis執行緒模型
- 五種網路I/O模型詳解模型
- java的nio之:淺析I/O模型Java模型
- 從網路I/O模型到Netty,先深入瞭解下I/O多路複用模型Netty
- 使用Task實現非阻塞式的I/O操作
- Java中I/O流:阻塞和非阻塞範例Java
- 簡述python非同步i/o庫 —— asyncioPython非同步
- 配置資料庫非同步I/O引數資料庫非同步
- 測試boot庫下I/O模型型別boot模型型別