Go語言市如何保證高併發的?

1、前戲

什麼市CSP?

當進行和G語言有關的討論的時候,你會經常聽到人們拋出CSP這個縮寫。在某些環境下CSP經常被讚美成Go語言成功的原因已經併發編程的“萬能鑰匙”。

那麼,CSP到底是什麼?爲什麼讓人們如此興奮呢?

CSP即“Communicating Sequential Processes”(通信順序進程),既是一個技術名詞,也是介紹這種技術的論文的名字。在論文中Hoare認爲輸入與輸出是兩個被忽略的編程原語,尤其是在併發代碼中。論文中的核心思想就是一個進程的輸出應該是另一個進程的輸入。

Go語言的併發原理一開始就建立在CSP之上,因此很容易閱讀、編寫和推理。

通常來講,一種語言將他們的抽象鏈結束在系統線程和內存訪問同步的層級。Go語言採用不同的路線,並使用gorountine和channel來替代這些概念。這些抽象能幫助我們做什麼呢?gorountine把我們從必須按照並行的方式思考解放出來,作爲替代,他與允許我們按照更爲自然的的等級對問題進行建模。

2、爲什麼用Go語言編寫併發程序很容易

在Go語言中,你可以直接將問題的描述編寫成代碼。

gorountine是很輕量級的,通常情況下,我們並不需要爲創建新的gorountine的代價而擔心。Go語言在運行時,自動將gorountine映射到系統的線程上,併爲我們管理他們之間的調度。

在使用Go語言的時候我們會在更細的顆粒度級別編寫併發代碼。例如,如果要實現一個網絡服務器,用Java編程你會不自然的將鏈接綁定到一個線程池。而Go語言不同,你可以爲每一個用戶請求創建一個獨立的gorountine,而不是將鏈接綁定到一個線程池。

3、語言的併發哲學

CSP一直是GO語言設計的重要組成部分。然而,Go語言還支持通過內存訪問同步和遵循該技術的原語來編寫併發代碼的傳統方式。sync與其它包中的結構體與方法可以讓你執行鎖,創建資源池來取代gorountine等。

但是,使用GO語言編寫併發程序,還是鼓勵使用CSP。Go語言的一個座右銘是,“使用通信來共享內存,而不是通過共享內存來通信”。

Go語言的併發哲學可以這樣總結:追求簡潔,儘量使用channel,並且認爲gorountine的使用是沒有成本的。

4、Go語言的併發組件

a、什麼是gorountine?

package miller

import "fmt"

func main()  {
	//簡單理解,goroutine就是一個併發的函數(記住,不一定是並行的),與其它
	//代碼一起運行。你可以簡單地在一個函數之前添加go關鍵字來觸發:
	go sayHello()
	//繼續執行自己的邏輯
}

func sayHello()  {
	fmt.Println("hello my dear!")
}

 

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