這篇文章主要介紹“go語言如何并發(fā)”的相關(guān)知識(shí),小編通過實(shí)際案例向大家展示操作過程,操作方法簡(jiǎn)單快捷,實(shí)用性強(qiáng),希望這篇“go語言如何并發(fā)”文章能幫助大家解決問題。
甘谷ssl適用于網(wǎng)站、小程序/APP、API接口等需要進(jìn)行數(shù)據(jù)傳輸應(yīng)用場(chǎng)景,ssl證書未來市場(chǎng)廣闊!成為成都創(chuàng)新互聯(lián)公司的ssl證書銷售渠道,可以享受市場(chǎng)價(jià)格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:18980820575(備注:SSL證書合作)期待與您的合作!
Go語言通過編譯器運(yùn)行時(shí)(runtime),從語言上支持了并發(fā)的特性;并發(fā)是通過goroutine完成。goroutine是一種非常輕量級(jí)的實(shí)現(xiàn),可在單個(gè)進(jìn)程里執(zhí)行成千上萬的并發(fā)任務(wù),它是Go語言并發(fā)設(shè)計(jì)的核心。使用go關(guān)鍵字就可以創(chuàng)建goroutine,將go聲明放到一個(gè)需調(diào)用的函數(shù)之前,在相同地址空間調(diào)用運(yùn)行這個(gè)函數(shù),這樣該函數(shù)執(zhí)行時(shí)便會(huì)作為一個(gè)獨(dú)立的并發(fā)線程。
并發(fā)指在同一時(shí)間內(nèi)可以執(zhí)行多個(gè)任務(wù)。并發(fā)編程含義比較廣泛,包含多線程編程、多進(jìn)程編程及分布式程序等。
Go 語言通過編譯器運(yùn)行時(shí)(runtime),從語言上支持了并發(fā)的特性。Go 語言的并發(fā)通過 goroutine 特性完成。goroutine 類似于線程,但是可以根據(jù)需要?jiǎng)?chuàng)建多個(gè) goroutine 并發(fā)工作。goroutine 是由 Go 語言的運(yùn)行時(shí)調(diào)度完成,而線程是由操作系統(tǒng)調(diào)度完成。
Go 語言還提供 channel 在多個(gè) goroutine 間進(jìn)行通信。goroutine 和 channel 是 Go 語言秉承的 CSP(Communicating Sequential Process)并發(fā)模式的重要實(shí)現(xiàn)基礎(chǔ)。
Goroutine 介紹
goroutine 是一種非常輕量級(jí)的實(shí)現(xiàn),可在單個(gè)進(jìn)程里執(zhí)行成千上萬的并發(fā)任務(wù),它是Go語言并發(fā)設(shè)計(jì)的核心。
說到底 goroutine 其實(shí)就是線程,但是它比線程更小,十幾個(gè) goroutine 可能體現(xiàn)在底層就是五六個(gè)線程,而且Go語言內(nèi)部也實(shí)現(xiàn)了 goroutine 之間的內(nèi)存共享。
使用 go 關(guān)鍵字就可以創(chuàng)建 goroutine,將 go 聲明放到一個(gè)需調(diào)用的函數(shù)之前,在相同地址空間調(diào)用運(yùn)行這個(gè)函數(shù),這樣該函數(shù)執(zhí)行時(shí)便會(huì)作為一個(gè)獨(dú)立的并發(fā)線程,這種線程在Go語言中則被稱為 goroutine。
goroutine 的用法如下:
//go 關(guān)鍵字放在方法調(diào)用前新建一個(gè) goroutine 并執(zhí)行方法體
go GetThingDone(param1, param2);
//新建一個(gè)匿名方法并執(zhí)行
go func(param1, param2) {
}(val1, val2)
//直接新建一個(gè) goroutine 并在 goroutine 中執(zhí)行代碼塊
go {
//do someting...
}
因?yàn)?goroutine 在多核 cpu 環(huán)境下是并行的,如果代碼塊在多個(gè) goroutine 中執(zhí)行,那么我們就實(shí)現(xiàn)了代碼的并行。
如果需要了解程序的執(zhí)行情況,怎么拿到并行的結(jié)果呢?需要配合使用channel進(jìn)行。
channel
channel 是Go語言在語言級(jí)別提供的 goroutine 間的通信方式。我們可以使用 channel 在兩個(gè)或多個(gè) goroutine 之間傳遞消息。
channel 是進(jìn)程內(nèi)的通信方式,因此通過 channel 傳遞對(duì)象的過程和調(diào)用函數(shù)時(shí)的參數(shù)傳遞行為比較一致,比如也可以傳遞指針等。如果需要跨進(jìn)程通信,我們建議用分布式系統(tǒng)的方法來解決,比如使用 Socket 或者 HTTP 等通信協(xié)議。Go語言對(duì)于網(wǎng)絡(luò)方面也有非常完善的支持。
channel 是類型相關(guān)的,也就是說,一個(gè) channel 只能傳遞一種類型的值,這個(gè)類型需要在聲明 channel 時(shí)指定。如果對(duì) Unix 管道有所了解的話,就不難理解 channel,可以將其認(rèn)為是一種類型安全的管道。
定義一個(gè) channel 時(shí),也需要定義發(fā)送到 channel 的值的類型,注意,必須使用 make 創(chuàng)建 channel,代碼如下所示:
ci := make(chan int)
cs := make(chan string)
cf := make(chan interface{})
回到在 Windows 和 Linux 出現(xiàn)之前的古老年代,在開發(fā)程序時(shí)并沒有并發(fā)的概念,因?yàn)槊钍匠绦蛟O(shè)計(jì)語言是以串行為基礎(chǔ)的,程序會(huì)順序執(zhí)行每一條指令,整個(gè)程序只有一個(gè)執(zhí)行上下文,即一個(gè)調(diào)用棧,一個(gè)堆。
并發(fā)則意味著程序在運(yùn)行時(shí)有多個(gè)執(zhí)行上下文,對(duì)應(yīng)著多個(gè)調(diào)用棧。我們知道每一個(gè)進(jìn)程在運(yùn)行時(shí),都有自己的調(diào)用棧和堆,有一個(gè)完整的上下文,而操作系統(tǒng)在調(diào)度進(jìn)程的時(shí)候,會(huì)保存被調(diào)度進(jìn)程的上下文環(huán)境,等該進(jìn)程獲得時(shí)間片后,再恢復(fù)該進(jìn)程的上下文到系統(tǒng)中。
從整個(gè)操作系統(tǒng)層面來說,多個(gè)進(jìn)程是可以并發(fā)的,那么并發(fā)的價(jià)值何在?下面我們先看以下幾種場(chǎng)景。
1) 一方面我們需要靈敏響應(yīng)的圖形用戶界面,一方面程序還需要執(zhí)行大量的運(yùn)算或者 IO 密集操作,而我們需要讓界面響應(yīng)與運(yùn)算同時(shí)執(zhí)行。
2) 當(dāng)我們的 Web 服務(wù)器面對(duì)大量用戶請(qǐng)求時(shí),需要有更多的“Web 服務(wù)器工作單元”來分別響應(yīng)用戶。
3) 我們的事務(wù)處于分布式環(huán)境上,相同的工作單元在不同的計(jì)算機(jī)上處理著被分片的數(shù)據(jù),計(jì)算機(jī)的 CPU 從單內(nèi)核(core)向多內(nèi)核發(fā)展,而我們的程序都是串行的,計(jì)算機(jī)硬件的能力沒有得到發(fā)揮。
4) 我們的程序因?yàn)?IO 操作被阻塞,整個(gè)程序處于停滯狀態(tài),其他 IO 無關(guān)的任務(wù)無法執(zhí)行。
從以上幾個(gè)例子可以看到,串行程序在很多場(chǎng)景下無法滿足我們的要求。下面我們歸納了并發(fā)程序的幾條優(yōu)點(diǎn),讓大家認(rèn)識(shí)到并發(fā)勢(shì)在必行:
并發(fā)能更客觀地表現(xiàn)問題模型;
并發(fā)可以充分利用 CPU 核心的優(yōu)勢(shì),提高程序的執(zhí)行效率;
并發(fā)能充分利用 CPU 與其他硬件設(shè)備固有的異步性。
關(guān)于“go語言如何并發(fā)”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí),可以關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,小編每天都會(huì)為大家更新不同的知識(shí)點(diǎn)。