Rust 和 Go 的並發模型有什麼不同,為什說 Rust 的並發模型更好 ?(1.0已沒有內建模型?

Rust 並發模型的介紹 The Rust Reference Manual


1.

在並發模型上面,Rust是典型的Actor Model(AM),而Go則是Communicating Sequential Processes Model(CSP)。在語法上面Rust和Go非常類似,都是通過Channel來實現自己的模型,但是具體的行為卻有些細微的差別。

在AM里,每個進程都是一個獨立的角色,每個角色擁有一個獨屬的命名郵箱。Actors之間通過非同步的往對方郵箱投遞信息來進行通信。

在CSP里,進程與進程之間通過一個管道來進行通信。消息可以順序的填入這個管道,也可以被逐次的從管道取出。注意到這個管道並不歸屬於某個進程。傳統上,CSP管道沒有緩存,填入與取出是同步的,由此也就保證了消息不會在通信的過程中丟失。Go額外的支持了帶buffer的管道,用於提供與AM模型類似的非同步通信。

在模型的實現上,兩者都實現了M:N的運行時協程Pre-emptive Scheduler。但由於Rust的目標領域是系統編程,所以運行時系統只作為可選擇的基礎庫附帶發行。在當前版本(0.11.0)下,默認進程與系統進程是1:1的。得益於Rust比較厲害的表意能力,可以非常容易的對其進行配置,且對於大部分功能程序的編碼來講是隱形的。

2.

如果有人表達Rust的並發模型要優於Go的話,那麼他多半想要提及下面的問題。

  1. Task是Fault-Isolation的、具有Identity的,而Go-Routine不是;
  2. Go沒有對狀態共享(資源競爭)做出顯式的編譯期檢查(http://blog.golang.org/race-detector),而Rust則做了相當多的努力(當然也帶來了語法上的複雜);
  3. Rust可以關閉運行時系統,而Go則伴隨著Pause Garbage Collection等運行時問題;

總的來講,Go更像Python,目標領域是快速開發,而Rust則更像C,目標領域是系統編程。我沒有能力對上述的工程Tradeoff做出評價,大家可以自行判斷。


沒具體寫過rust,無法比較,感覺rust的task和chan與goroutine和chan類似。可以參看hn上這個討論:How does the concurrency primitives in Rust compare to the ones in Go?


推薦閱讀:

為什麼微軟的編程語言C# F#的編譯器要那麼多黑科技?
微軟蘇州Bing可以接觸要哪些技術?編程語言是不是以C#為主,可以自己選擇嗎?
HTML5 是一門編程語言嗎?
在IDLE上寫Python, low嗎?

TAG:編程語言 | Go語言 | Rust編程語言 |