2011-09-20 42 views
17

當調用runtime.GOMAXPROCS(1)在運行時將只使用一個線程爲所有你的goroutines。在進行io時,你的goroutines會屈服,讓其他goroutines在同一個線程上運行。.net異步和谷歌去輕量級線程之間的主要區別是什麼

如果您不使用後臺線程,這看起來與.net異步CTP功能如何進行協作併發性非常相似。

我的問題是你認爲哪種優勢或缺點可以考慮一種方法。

回答

23

做出價值判斷總是一件棘手的事情,所以我會強調3個不同之處。你決定他們是否陷入「專業」或「騙局」的桶。

  1. 雖然一起去,異步讓你寫代碼異步以簡單的方式,在.NET中你必須要知道你的代碼的一部分是異步,哪一個不是(即你必須明確地使用async/await關鍵字)。在Go中,您不需要知道 - 運行時使其「只是工作」,沒有特殊的語法來標記異步代碼。

  2. Go設計在標準庫中不需要任何特殊代碼。 .NET需要爲每個異步操作向標準庫添加新代碼,實際上這些情況下API面翻倍。有新的異步HTTP下載API和舊的非異步HTTP下載API必須保持向後兼容。

  3. Go的設計和實現在數量級上更簡單。一小段運行時代碼(調度程序)負責暫停阻塞系統調用的goroutine並讓步睡眠goroutines。標準庫中不需要任何特殊的異步支持。

.NET實現首先需要添加上述新的API。此外,.NET實現基於編譯器重寫代碼,將異步/等待轉換爲等效的狀態機。它非常聰明,但也相當複雜。實際的結果是,第一個異步CTP已經知道錯誤,而Go的實現從一開始就工作得非常好。

最終,它並不重要。異步/等待是在.NET中編寫異步代碼的最佳方式。 Goroutines是在Go中獲得的最佳方式。兩者都很好,特別是與大多數其他語言的替代品相比。

+0

真的很棒的答案謝謝。對於需要在2種語言之間進行選擇的人,我更多地考慮執行速度表現。 – skyde

+10

我不確定我是否同意。你可以在C#和Java中使用thread-per-process(通道就是同步隊列)編寫go-style goroutines。在許多情況下,您並不關心Go goroutines在多個OS線程中複用的事實。 C#異步承諾你某些代碼將運行在同一個操作系統線程中,這對於UI線程來說非常有用。你不能得到這樣的承諾。 –

+0

Sombody可以提供一個例子,說明如何在Go中模擬等待?據我所知,沒有這樣的事情。 – Kugel

相關問題