您好,登錄后才能下訂單哦!
這篇文章主要介紹“go語言如何并發”的相關知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“go語言如何并發”文章能幫助大家解決問題。
Go語言通過編譯器運行時(runtime),從語言上支持了并發的特性;并發是通過goroutine完成。goroutine是一種非常輕量級的實現,可在單個進程里執行成千上萬的并發任務,它是Go語言并發設計的核心。使用go關鍵字就可以創建goroutine,將go聲明放到一個需調用的函數之前,在相同地址空間調用運行這個函數,這樣該函數執行時便會作為一個獨立的并發線程。
并發指在同一時間內可以執行多個任務。并發編程含義比較廣泛,包含多線程編程、多進程編程及分布式程序等。
Go 語言通過編譯器運行時(runtime),從語言上支持了并發的特性。Go 語言的并發通過 goroutine 特性完成。goroutine 類似于線程,但是可以根據需要創建多個 goroutine 并發工作。goroutine 是由 Go 語言的運行時調度完成,而線程是由操作系統調度完成。
Go 語言還提供 channel 在多個 goroutine 間進行通信。goroutine 和 channel 是 Go 語言秉承的 CSP(Communicating Sequential Process)并發模式的重要實現基礎。
Goroutine 介紹
goroutine 是一種非常輕量級的實現,可在單個進程里執行成千上萬的并發任務,它是Go語言并發設計的核心。
說到底 goroutine 其實就是線程,但是它比線程更小,十幾個 goroutine 可能體現在底層就是五六個線程,而且Go語言內部也實現了 goroutine 之間的內存共享。
使用 go 關鍵字就可以創建 goroutine,將 go 聲明放到一個需調用的函數之前,在相同地址空間調用運行這個函數,這樣該函數執行時便會作為一個獨立的并發線程,這種線程在Go語言中則被稱為 goroutine。
goroutine 的用法如下:
//go 關鍵字放在方法調用前新建一個 goroutine 并執行方法體
go GetThingDone(param1, param2);
//新建一個匿名方法并執行
go func(param1, param2) {
}(val1, val2)
//直接新建一個 goroutine 并在 goroutine 中執行代碼塊
go {
//do someting...
}
因為 goroutine 在多核 cpu 環境下是并行的,如果代碼塊在多個 goroutine 中執行,那么我們就實現了代碼的并行。
如果需要了解程序的執行情況,怎么拿到并行的結果呢?需要配合使用channel進行。
channel
channel 是Go語言在語言級別提供的 goroutine 間的通信方式。我們可以使用 channel 在兩個或多個 goroutine 之間傳遞消息。
channel 是進程內的通信方式,因此通過 channel 傳遞對象的過程和調用函數時的參數傳遞行為比較一致,比如也可以傳遞指針等。如果需要跨進程通信,我們建議用分布式系統的方法來解決,比如使用 Socket 或者 HTTP 等通信協議。Go語言對于網絡方面也有非常完善的支持。
channel 是類型相關的,也就是說,一個 channel 只能傳遞一種類型的值,這個類型需要在聲明 channel 時指定。如果對 Unix 管道有所了解的話,就不難理解 channel,可以將其認為是一種類型安全的管道。
定義一個 channel 時,也需要定義發送到 channel 的值的類型,注意,必須使用 make 創建 channel,代碼如下所示:
ci := make(chan int)
cs := make(chan string)
cf := make(chan interface{})
回到在 Windows 和 Linux 出現之前的古老年代,在開發程序時并沒有并發的概念,因為命令式程序設計語言是以串行為基礎的,程序會順序執行每一條指令,整個程序只有一個執行上下文,即一個調用棧,一個堆。
并發則意味著程序在運行時有多個執行上下文,對應著多個調用棧。我們知道每一個進程在運行時,都有自己的調用棧和堆,有一個完整的上下文,而操作系統在調度進程的時候,會保存被調度進程的上下文環境,等該進程獲得時間片后,再恢復該進程的上下文到系統中。
從整個操作系統層面來說,多個進程是可以并發的,那么并發的價值何在?下面我們先看以下幾種場景。
1) 一方面我們需要靈敏響應的圖形用戶界面,一方面程序還需要執行大量的運算或者 IO 密集操作,而我們需要讓界面響應與運算同時執行。
2) 當我們的 Web 服務器面對大量用戶請求時,需要有更多的“Web 服務器工作單元”來分別響應用戶。
3) 我們的事務處于分布式環境上,相同的工作單元在不同的計算機上處理著被分片的數據,計算機的 CPU 從單內核(core)向多內核發展,而我們的程序都是串行的,計算機硬件的能力沒有得到發揮。
4) 我們的程序因為 IO 操作被阻塞,整個程序處于停滯狀態,其他 IO 無關的任務無法執行。
從以上幾個例子可以看到,串行程序在很多場景下無法滿足我們的要求。下面我們歸納了并發程序的幾條優點,讓大家認識到并發勢在必行:
并發能更客觀地表現問題模型;
并發可以充分利用 CPU 核心的優勢,提高程序的執行效率;
并發能充分利用 CPU 與其他硬件設備固有的異步性。
關于“go語言如何并發”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識,可以關注億速云行業資訊頻道,小編每天都會為大家更新不同的知識點。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。