bl双性强迫侵犯h_国产在线观看人成激情视频_蜜芽188_被诱拐的少孩全彩啪啪漫画

Go協(xié)程實現(xiàn)原理和使用分析是怎樣的

這期內(nèi)容當(dāng)中小編將會給大家?guī)碛嘘P(guān) Go協(xié)程實現(xiàn)原理和使用分析是怎樣的,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

創(chuàng)新互聯(lián)建站專業(yè)為企業(yè)提供玉溪網(wǎng)站建設(shè)、玉溪做網(wǎng)站、玉溪網(wǎng)站設(shè)計、玉溪網(wǎng)站制作等企業(yè)網(wǎng)站建設(shè)、網(wǎng)頁設(shè)計與制作、玉溪企業(yè)網(wǎng)站模板建站服務(wù),10多年玉溪做網(wǎng)站經(jīng)驗,不只是建網(wǎng)站,更提供有價值的思路和整體網(wǎng)絡(luò)服務(wù)。

Go 并發(fā)編程原理

Go 語言的協(xié)程實現(xiàn)被稱之為 goroutine,由 Go 運行時管理,在 Go 語言中通過協(xié)程實現(xiàn)并發(fā)編程非常簡單:我們可以在一個處理進程中通過關(guān)鍵字 go 啟用多個協(xié)程,然后在不同的協(xié)程中完成不同的子任務(wù),這些用戶在代碼中創(chuàng)建和維護的協(xié)程本質(zhì)上是用戶級線程,Go 語言運行時會在底層通過調(diào)度器將用戶級線程交給操作系統(tǒng)的系統(tǒng)級線程去處理,如果在運行過程中遇到某個 IO 操作而暫停運行,調(diào)度器會將用戶級線程和系統(tǒng)級線程分離,以便讓系統(tǒng)級線程去處理其他用戶級線程,而當(dāng) IO 操作完成,需要恢復(fù)運行,調(diào)度器又會調(diào)度空閑的系統(tǒng)級線程來處理這個用戶級線程,從而達(dá)到并發(fā)處理多個協(xié)程的目的。此外,調(diào)度器還會在系統(tǒng)級線程不夠用時向操作系統(tǒng)申請創(chuàng)建新的系統(tǒng)級線程,而在系統(tǒng)級線程過多的情況下銷毀一些空閑的線程,這個過程和 PHP-FPM 的工作機制有點類似,實際上這也是很多進程/線程池管理器的工作機制,這樣一來,可以保證對系統(tǒng)資源的高效利用,避免系統(tǒng)資源的浪費。

以上,就是 Go 語言并發(fā)編程的獨特實現(xiàn)模型。

協(xié)程簡單示例

下面通過一個簡單的示例來演示如何在 Go 語言中通過協(xié)程進行并發(fā)編程,我們在 add.go 中編寫一個加法函數(shù) add并通過協(xié)程的方式來調(diào)用它:

package main
import "fmt"
func add(a, b int) {    var c = a + b;    fmt.Printf("%d + %d = %d", a, b, c)}
func main() {    go add(1, 2)}

嗯,就是這么簡單,在這段代碼中包含了兩個協(xié)程,一個是顯式的,通過 go 關(guān)鍵字聲明的這條語句,表示啟用一個新的協(xié)程來處理加法運算,另一個是隱式的,即 main 函數(shù)本身也是運行在一個主協(xié)程中,該協(xié)程和調(diào)用 add 函數(shù)的子協(xié)程是并發(fā)運行的兩個協(xié)程,就好比從 go 關(guān)鍵字開始,從主協(xié)程中叉出一條新路。和之前不使用協(xié)程的方式相比,由此也引入了不確定性:我們不知道子協(xié)程什么時候執(zhí)行完畢,運行到了什么狀態(tài)。在主協(xié)程中啟動子協(xié)程后,程序就退出運行了,這就意味著包含這兩個協(xié)程的處理進程退出了,所以,我們運行這段代碼,不會看到子協(xié)程里運行的打印結(jié)果,因為還沒來得及執(zhí)行它們,進程就已經(jīng)退出了。另外,我們也不要試圖從 add 函數(shù)返回處理結(jié)果,因為在主協(xié)程中,根本獲取不到子協(xié)程的返回值,從子協(xié)程開始執(zhí)行起就已經(jīng)和主協(xié)程沒有任何關(guān)系了,返回值會被丟棄。

如果要顯示出子協(xié)程的打印結(jié)果,一種方式是在主協(xié)程中等待足夠長的時間再退出,以便保證子協(xié)程中的所有代碼執(zhí)行完畢:

package main
import (    "fmt"    "time")
func add(a, b int) {    var c = a + b;    fmt.Printf("%d + %d = %d\n", a, b, c)}
func main() {    go add(1, 2)    time.Sleep(1e9)}

這里,我們通過 time.Sleep(1e9) 讓主協(xié)程等待 1s 后退出,這樣,運行 go run add.go 就可以看到打印結(jié)果了:

Go協(xié)程實現(xiàn)原理和使用分析是怎樣的

不過,這種方式過于簡單粗暴,對于加法運算,1s 肯定夠了(而且根本不需要這么長時間),但是如果是數(shù)據(jù)庫連接、發(fā)送郵件之類的難以預(yù)估時間的操作呢?這種方式就不合適了,我們需要一種更精準(zhǔn)的方式在子協(xié)程執(zhí)行完畢后,立即退出主協(xié)程,這就涉及到協(xié)程間的通信,我們將在下一篇教程中重點討論這一塊,并且通過協(xié)程間通信來重寫這段代碼。

并發(fā)執(zhí)行示例

目前為止,我們僅僅演示了 Go 語言協(xié)程的啟動和簡單使用,但是通過上述代碼還不足以驗證協(xié)程是并發(fā)執(zhí)行的,接下來,我們通過下面這段代碼來驗證協(xié)程的并發(fā)執(zhí)行:

package main
import (    "fmt"    "time")
func add(a, b int) {    var c = a + b;    fmt.Printf("%d + %d = %d\n", a, b, c)}
func main() {    for i := 0; i < 10; i++ {        go add(1, i)    }    time.Sleep(1e9)}

很簡單,我們給協(xié)程代碼外層套上一個循環(huán)就可以了,這樣一來,就同時啟動了 10 個子協(xié)程,由于它們是并發(fā)執(zhí)行的,執(zhí)行的先后順序無法保證,所以我們就看到了這樣的打印結(jié)果:

Go協(xié)程實現(xiàn)原理和使用分析是怎樣的

如果你還不放心,可以在 add 函數(shù)最后添加如下這段代碼:

time.Sleep(3e9)

表示每個子協(xié)程中執(zhí)行完打印語句睡眠 3 秒再退出,如果不是并發(fā)執(zhí)行,那么肯定至多只能打印一條結(jié)果出來,但實際情況是,仍然是打印 10 條結(jié)果,并且沒有任何延遲,證明這些加法運算是并發(fā)執(zhí)行的。

上述就是小編為大家分享的 Go協(xié)程實現(xiàn)原理和使用分析是怎樣的了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關(guān)知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。

本文標(biāo)題:Go協(xié)程實現(xiàn)原理和使用分析是怎樣的
本文鏈接:http://vcdvsql.cn/article40/peggeo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供定制網(wǎng)站App設(shè)計、網(wǎng)頁設(shè)計公司、品牌網(wǎng)站建設(shè)網(wǎng)站導(dǎo)航

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

微信小程序開發(fā)