亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Golang > 正文

Go語言并發(fā)技術(shù)詳解

2020-04-01 19:24:29
字體:
供稿:網(wǎng)友
這篇文章主要介紹了Go語言并發(fā)技術(shù)詳解,本文講解了goroutine、channels、Buffered Channels、Range和Close等內(nèi)容,需要的朋友可以參考下
 

有人把Go比作21世紀(jì)的C語言,第一是因?yàn)镚o語言設(shè)計(jì)簡(jiǎn)單,第二,21世紀(jì)最重要的就是并行程序設(shè)計(jì),而Go從語言層面就支持了并行。

goroutine

goroutine是Go并行設(shè)計(jì)的核心。goroutine說到底其實(shí)就是線程,但是它比線程更小,十幾個(gè)goroutine可能體現(xiàn)在底層就是五六個(gè)線程,Go語言內(nèi)部幫你實(shí)現(xiàn)了這些goroutine之間的內(nèi)存共享。執(zhí)行g(shù)oroutine只需極少的棧內(nèi)存(大概是4~5KB),當(dāng)然會(huì)根據(jù)相應(yīng)的數(shù)據(jù)伸縮。也正因?yàn)槿绱?,可同時(shí)運(yùn)行成千上萬個(gè)并發(fā)任務(wù)。goroutine比thread更易用、更高效、更輕便。

goroutine是通過Go的runtime管理的一個(gè)線程管理器。goroutine通過go關(guān)鍵字實(shí)現(xiàn)了,其實(shí)就是一個(gè)普通的函數(shù)。

復(fù)制代碼代碼如下:

go hello(a, b, c)

 

通過關(guān)鍵字go就啟動(dòng)了一個(gè)goroutine。我們來看一個(gè)例子

復(fù)制代碼代碼如下:

package main

 

import (
    "fmt"
    "runtime"
)

func say(s string) {
    for i := 0; i < 5; i++ {
        runtime.Gosched()
        fmt.Println(s)
    }
}

func main() {
    go say("world") //開一個(gè)新的Goroutines執(zhí)行
    say("hello") //當(dāng)前Goroutines執(zhí)行
}

// 以上程序執(zhí)行后將輸出:
// hello
// world
// hello
// world
// hello
// world
// hello
// world
// hello

 

我們可以看到go關(guān)鍵字很方便的就實(shí)現(xiàn)了并發(fā)編程。 上面的多個(gè)goroutine運(yùn)行在同一個(gè)進(jìn)程里面,共享內(nèi)存數(shù)據(jù),不過設(shè)計(jì)上我們要遵循:不要通過共享來通信,而要通過通信來共享。

runtime.Gosched()表示讓CPU把時(shí)間片讓給別人,下次某個(gè)時(shí)候繼續(xù)恢復(fù)執(zhí)行該goroutine。

默認(rèn)情況下,調(diào)度器僅使用單線程,也就是說只實(shí)現(xiàn)了并發(fā)。想要發(fā)揮多核處理器的并行,需要在我們的程序中顯式調(diào)用 runtime.GOMAXPROCS(n) 告訴調(diào)度器同時(shí)使用多個(gè)線程。GOMAXPROCS 設(shè)置了同時(shí)運(yùn)行邏輯代碼的系統(tǒng)線程的最大數(shù)量,并返回之前的設(shè)置。如果n < 1,不會(huì)改變當(dāng)前設(shè)置。以后Go的新版本中調(diào)度得到改進(jìn)后,這將被移除。這里有一篇Rob介紹的關(guān)于并發(fā)和并行的文章:http://concur.rspace.googlecode.com/hg/talk/concur.html#landing-slide

channels

goroutine運(yùn)行在相同的地址空間,因此訪問共享內(nèi)存必須做好同步。那么goroutine之間如何進(jìn)行數(shù)據(jù)的通信呢,Go提供了一個(gè)很好的通信機(jī)制channel。channel可以與Unix shell 中的雙向管道做類比:可以通過它發(fā)送或者接收值。這些值只能是特定的類型:channel類型。定義一個(gè)channel時(shí),也需要定義發(fā)送到channel的值的類型。注意,必須使用make 創(chuàng)建channel:

復(fù)制代碼代碼如下:

ci := make(chan int)
cs := make(chan string)
cf := make(chan interface{})

 

channel通過操作符<-來接收和發(fā)送數(shù)據(jù)

復(fù)制代碼代碼如下:

ch <- v    // 發(fā)送v到channel ch.
v := <-ch  // 從ch中接收數(shù)據(jù),并賦值給v

 

我們把這些應(yīng)用到我們的例子中來:

復(fù)制代碼代碼如下:

package main

 

import "fmt"

func sum(a []int, c chan int) {
    total := 0
    for _, v := range a {
        total += v
    }
    c <- total  // send total to c
}

func main() {
    a := []int{7, 2, 8, -9, 4, 0}

    c := make(chan int)
    go sum(a[:len(a)/2], c)
    go sum(a[len(a)/2:], c)
    x, y := <-c, <-c  // receive from c

    fmt.Println(x, y, x + y)
}

 

默認(rèn)情況下,channel接收和發(fā)送數(shù)據(jù)都是阻塞的,除非另一端已經(jīng)準(zhǔn)備好,這樣就使得Goroutines同步變的更加的簡(jiǎn)單,而不需要顯式的lock。所謂阻塞,也就是如果讀?。╲alue := <-ch)它將會(huì)被阻塞,直到有數(shù)據(jù)接收。其次,任何發(fā)送(ch<-5)將會(huì)被阻塞,直到數(shù)據(jù)被讀出。無緩沖channel是在多個(gè)goroutine之間同步很棒的工具。

Buffered Channels

上面我們介紹了默認(rèn)的非緩存類型的channel,不過Go也允許指定channel的緩沖大小,很簡(jiǎn)單,就是channel可以存儲(chǔ)多少元素。ch:= make(chan bool, 4),創(chuàng)建了可以存儲(chǔ)4個(gè)元素的bool 型channel。在這個(gè)channel 中,前4個(gè)元素可以無阻塞的寫入。當(dāng)寫入第5個(gè)元素時(shí),代碼將會(huì)阻塞,直到其他goroutine從channel 中讀取一些元素,騰出空間。

復(fù)制代碼代碼如下:

ch := make(chan type, value)

 

value == 0 ! 無緩沖(阻塞)
value > 0 ! 緩沖(非阻塞,直到value 個(gè)元素)

 

我們看一下下面這個(gè)例子,你可以在自己本機(jī)測(cè)試一下,修改相應(yīng)的value值

復(fù)制代碼代碼如下:

package main

 

import "fmt"

func main() {
    c := make(chan int, 2)//修改2為1就報(bào)錯(cuò),修改2為3可以正常運(yùn)行
    c <- 1
    c <- 2
    fmt.Println(<-c)
    fmt.Println(<-c)
}

 

Range和Close

上面這個(gè)例子中,我們需要讀取兩次c,這樣不是很方便,Go考慮到了這一點(diǎn),所以也可以通過range,像操作slice或者map一樣操作緩存類型的channel,請(qǐng)看下面的例子

復(fù)制代碼代碼如下:

package main

 

import (
    "fmt"
)

func fibonacci(n int, c chan int) {
    x, y := 1, 1
    for i := 0; i < n; i++ {
        c <- x
        x, y = y, x + y
    }
    close(c)
}

func main() {
    c := make(chan int, 10)
    go fibonacci(cap(c), c)
    for i := range c {
        fmt.Println(i)
    }
}


for i := range c能夠不斷的讀取channel里面的數(shù)據(jù),直到該channel被顯式的關(guān)閉。上面代碼我們看到可以顯式的關(guān)閉channel,生產(chǎn)者通過內(nèi)置函數(shù)close關(guān)閉channel。關(guān)閉channel之后就無法再發(fā)送任何數(shù)據(jù)了,在消費(fèi)方可以通過語法v, ok := <-ch測(cè)試channel是否被關(guān)閉。如果ok返回false,那么說明channel已經(jīng)沒有任何數(shù)據(jù)并且已經(jīng)被關(guān)閉。

 

記住應(yīng)該在生產(chǎn)者的地方關(guān)閉channel,而不是消費(fèi)的地方去關(guān)閉它,這樣容易引起panic

另外記住一點(diǎn)的就是channel不像文件之類的,不需要經(jīng)常去關(guān)閉,只有當(dāng)你確實(shí)沒有任何發(fā)送數(shù)據(jù)了,或者你想顯式的結(jié)束range循環(huán)之類的。

Select

我們上面介紹的都是只有一個(gè)channel的情況,那么如果存在多個(gè)channel的時(shí)候,我們?cè)撊绾尾僮髂?,Go里面提供了一個(gè)關(guān)鍵字select,通過select可以監(jiān)聽channel上的數(shù)據(jù)流動(dòng)。

select默認(rèn)是阻塞的,只有當(dāng)監(jiān)聽的channel中有發(fā)送或接收可以進(jìn)行時(shí)才會(huì)運(yùn)行,當(dāng)多個(gè)channel都準(zhǔn)備好的時(shí)候,select是隨機(jī)的選擇一個(gè)執(zhí)行的。

 

復(fù)制代碼代碼如下:

package main

 

import "fmt"

func fibonacci(c, quit chan int) {
    x, y := 1, 1
    for {
        select {
        case c <- x:
            x, y = y, x + y
        case <-quit:
            fmt.Println("quit")
            return
        }
    }
}

func main() {
    c := make(chan int)
    quit := make(chan int)
    go func() {
        for i := 0; i < 10; i++ {
            fmt.Println(<-c)
        }
        quit <- 0
    }()
    fibonacci(c, quit)
}

 

在select里面還有default語法,select其實(shí)就是類似switch的功能,default就是當(dāng)監(jiān)聽的channel都沒有準(zhǔn)備好的時(shí)候,默認(rèn)執(zhí)行的(select不再阻塞等待channel)。

復(fù)制代碼代碼如下:

select {
case i := <-c:
    // use i
default:
    // 當(dāng)c阻塞的時(shí)候執(zhí)行這里
}

 

超時(shí)

有時(shí)候會(huì)出現(xiàn)goroutine阻塞的情況,那么我們?nèi)绾伪苊庹麄€(gè)程序進(jìn)入阻塞的情況呢?我們可以利用select來設(shè)置超時(shí),通過如下的方式實(shí)現(xiàn):

復(fù)制代碼代碼如下:

func main() {
    c := make(chan int)
    o := make(chan bool)
    go func() {
        for {
            select {
                case v := <- c:
                    println(v)
                case <- time.After(5 * time.Second):
                    println("timeout")
                    o <- true
                    break
            }
        }
    }()
    <- o
}

 

runtime goroutine

runtime包中有幾個(gè)處理goroutine的函數(shù):

Goexit

退出當(dāng)前執(zhí)行的goroutine,但是defer函數(shù)還會(huì)繼續(xù)調(diào)用

Gosched

讓出當(dāng)前goroutine的執(zhí)行權(quán)限,調(diào)度器安排其他等待的任務(wù)運(yùn)行,并在下次某個(gè)時(shí)候從該位置恢復(fù)執(zhí)行。

NumCPU

返回 CPU 核數(shù)量

NumGoroutine

返回正在執(zhí)行和排隊(duì)的任務(wù)總數(shù)

GOMAXPROCS

用來設(shè)置可以并行計(jì)算的CPU核數(shù)的最大值,并返回之前的值。


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
男人的天堂av网| 狠狠色伊人亚洲综合成人| 国产剧情麻豆剧果冻传媒视频免费| 麻豆精品久久| 9i精品一二三区| 性做久久久久久| 国产不卡在线| 免费在线观看日韩视频| 午夜影院在线播放| 国产精品白浆流出视频| 91视频99| 亚洲wwww| 久久动漫网址| 草裙成人精品一区二区三区| 625成人欧美午夜电影| 欧美成人在线免费| 国产精品嫩草影院av蜜臀| 久久影院理伦片| 国产精品久久久久久亚洲毛片| 亚洲狼人综合干| 日韩一区国产在线观看| 日本在线观看天堂男亚洲| www.国产在线| 黑人另类精品××××性爽| 国产精品18久久久久久久网站| 国产高清av| 日本午夜精品理论片a级appf发布| 91夜夜揉人人捏人人添红杏| 高清视频在线观看一区| 91porny九色| 欧美韩国日本综合| 精品国产伦理网| 国产亚洲精品一区二555| 欧美三级网页| 成年女人免费v片| 喷水视频在线观看| 在线观看av不卡| 91久久香蕉国产日韩欧美9色| 91在线导航| 91激情在线视频| 99视频精品免费观看| 国产精品久久久对白| 欧美三级电影一区二区三区| av免费不卡国产观看| 亚洲欧洲视频在线观看| 在线免费观看色| 久久爱另类一区二区小说| 国产日韩欧美一区二区三区| 久久久精品视频在线观看| 手机看片福利在线观看| 欧美大尺度做爰床戏| 天天综合色天天| 国产伦精品一区二区三区视频金莲| 美女av免费看| 欧美在线观看网址综合| 激情 小说 亚洲 图片: 伦| 欧美高清一级大片| 日本亚洲欧洲无免费码在线| 最新电影电视剧在线观看免费观看| 久操视频在线免费播放| 伊人久久大香线蕉综合热线| 中文字幕亚洲乱码熟女1区2区| 99精品国产高清一区二区| 五月天色网站| 欧美啪啪一区| 福利一区福利二区| 亚洲一二三不卡| 午夜日韩视频| 欧美特黄一级| 91在线观看高清| 国产高潮视频在线观看| 亚洲欧美精品一区二区三区| 美女久久久久久久久久| 无码av中文一区二区三区桃花岛| 天天摸日日摸狠狠添| 先锋音影av资源中文网| 成人精品一区二区三区免费| 久久免费观看视频| 天天综合天天做天天综合| 羞羞视频在线免费国产| 国产女人高潮毛片| 国产精品嫩草影视| 亚洲专区在线| 亚洲三级免费电影| 亚洲欧美日韩国产中文在线| aaa国产一区| 少妇一区二区三区| 嫩草香蕉在线91一二三区| 亚洲精品视频播放| 精品乱人伦一区二区三区| av中文字幕一区二区三区| 日韩精品美女| 午夜伦理大片视频在线观看| 国产精品无码无卡无需播放器| 国产精品无码久久久久一区二区| 神马影院我不卡午夜| 日韩av播放器| 国产精品夜色7777狼人| 国产精品久久不能| 欧美一区二区三区成人精品| 一级黄色片日本| 91蝌蚪91九色| 成人免费乱码大片a毛片软件| 国产人成亚洲第一网站在线播放| 综合激情网五月| 久久久久久久久久一区| 久久综合色鬼综合色| 伊人久久五月天| 中国a一片一级一片| 欧美激情欧美激情在线五月| 欧美aaaaaa| 日本视频网站在线观看| 亚洲永久精品ww.7491进入| 精品欧美国产一区二区三区| 欧美成人国产精品高潮| 国产精品扒开腿做爽爽| 神马影院我不卡| www.555国产精品免费| 日本成人精品在线| 超污视频在线播放| 亚洲乱码国产乱码精品精| 综合欧美视频一区二区三区| 亚洲欧美日韩激情| 亚洲中无吗在线| 亚洲深夜影院| 免费看成人av| 欧美日韩高清在线观看| 亚洲精品7777| 中文字幕欧美激情| 欧美性猛交xxxx乱大交hd| 欧美黑人一级爽快片淫片高清| 精品女厕一区二区三区| 精品欧美一区二区在线观看视频| 亚洲污视频在线观看| 亚洲欧美日韩一区二区三区四区| 久久爱www久久做| jlzzjizz在线播放观看| 另类高清dbsm日本tvav| 亚洲精品无码久久久| 国产精品伊人久久| 中文字幕在线中文字幕在线中三区| 久热这里只有精品6| 日韩成人黄色av| 亚洲国产日韩综合久久精品| 国产美女福利在线观看| 久久一区二区三区四区五区| 丝袜足脚交91精品| 国产精品欧美一区二区三区奶水| 天天爽人人爽夜夜爽| 精品国产乱码久久久久久108| 韩国视频理论视频久久| xxxxx性13一14| 91tv精品福利国产在线观看| 精品中文字幕在线| 91精品入口| 极品美女扒开粉嫩小泬| 日韩欧美一区在线观看| 国产福利91精品| 精品中文字幕一区二区三区| 亚洲av无码乱码国产精品久久| 久久综合导航| 国产黄a三级三级三级av在线看| 成人狠狠色综合| 欧美性猛交xxxx乱大交丰满| 欧美一级片在线播放| 久久精品视频免费看| 黄页网站大全一区二区| 电影亚洲精品噜噜在线观看| 奇米视频888| 午夜视频在线免费| 国产综合18久久久久久| 国产精品99久久久久久久久| 久久久一本精品99久久精品| 欧美午夜一区二区三区免费大片| 免费男女羞羞的视频网站主页在线观看| 91免费在线视频观看| 欧美aⅴ一区二区三区视频| 亚洲一区二区三区四区不卡| 欧美a视频在线| 性欧美精品xxxx| 91影院未满十八岁禁止入内| 欧美男女爱爱视频| 日韩电影免费观看在| 国产精品久久免费| 高清不卡一区| 91久久香蕉国产日韩欧美9色| 欧美有码视频| 国产精品久久久久久亚洲影视| 一本久道久久综合无码中文| 欧美色图在线视频| 日韩免费在线播放| 欧美在线免费| 成人做爰视频www网站小优视频| 欧美性www| 69看片网站| 成人av资源在线观看| 久久久久久久久久影院| 无码精品视频一区二区三区| 瑟瑟网站在线观看| 69精品人人人人| 亚洲色图综合网| 九九热在线视频| 影音先锋一区| 一级欧洲+日本+国产| 一区二区精品国产| 欧美一进一出视频| 国产剧情在线一区| 欧美变态xxxx| 1024亚洲| 久久神马影院| 日韩亚洲色图| 久久午夜羞羞影院免费观看| 国产乱在线观看完整版视频| 日韩女优中文字幕| 九色成人在线| 欧美精品欧美精品系列c| 欧美中文字幕在线观看视频| 亚洲精品一区二区三区区别| 亚洲欧美日韩视频二区| 日韩毛片中文字幕| 在线国产一区二区三区| 久久99精品久久久久久动态图| 中国黄色片一级| 亚洲精品久久久久久久久久久久| 欧美激情免费看| 性欧美亚洲xxxx乳在线观看| 韩国一区二区av| 爱草在线视频| 手机福利小视频在线播放| 91精品国产乱码久久久竹菊| 少妇黄色一级片| 男人与禽猛交狂配| 国产在线美女| 欧美久久天堂| 国产99久久久久久免费看| 国产成人免费看| 国产精品av久久久久久无| 亚洲一区二区三区免费在线观看| 超碰成人免费在线| 小香蕉视频在线| 精品一区二区久久久久久久网站| www.操.com| 国产成人高潮免费观看精品| 小说区图片区图片区另类灬| 性xxxfllreexxx少妇| 尤物99国产成人精品视频| 成人欧美一区二区三区黑人孕妇| 熟女人妻一区二区三区免费看| 日韩一区二区三区高清| 免费看日b视频| 精品久久无码中文字幕| 国产精品乱码一区二三区小蝌蚪| 手机在线看片日韩| 狠狠色丁香婷综合久久| 99久久777色| www.色五月| 国产精品麻豆免费版现看视频| 日韩伦理精品| 日韩欧美中文一区二区| 在线视频中文字幕久| 日韩精品中文字| 国产青草视频在线观看| 色偷偷成人一区二区三区91| 91精品999| 精品成av人一区二区三区| 91国产免费视频| 中文字幕免费在线观看视频| 日本黄色动态图| 波多野结衣办公室双飞| 亚洲伊人一本大道中文字幕| 国产男女在线观看| 亚洲二区中文字幕| 在线观看不卡| 亚洲成人人体| 999精彩视频| 福利一区福利二区微拍刺激| 中文字幕乱码亚洲无线精品一区| 久久成人亚洲精品| 国产911网站| 欧美日韩电影在线播放| 久久久久国产精品熟女影院| 青青草精品在线视频| 特大巨黑人吊性xxxxn38| 国产精品一卡二卡在线观看| 香蕉久久精品| 图片区 小说区 区 亚洲五月| 亚洲精品一二三**| 国产精品视频yy9099| www.浪潮av.com| 国产污视频在线| 一道精品视频一区二区三区男同| 91在线资源| 黑人巨大猛交丰满少妇| 久久天堂影院| 免费资源在线观看| 一区二区三区国产豹纹内裤在线| 欧美精品xx| 亲爱的老师9免费观看全集电视剧| 高清不卡在线观看av| 日韩av毛片| 成人免费毛片app| 国产黄色免费电影| 亚洲社区在线观看| 日韩高清不卡一区| www.黄在线观看| 亚洲精品20p| 国产在线播放一区二区三区| 欧美国产大片| 91free张津瑜movies| av男人天堂一区| 成人高清视频在线| 成人av中文| 91亚洲精选| 精品国产福利视频| 又紧又大又爽精品一区二区| 永久免费av无码网站性色av| 免费在线午夜视频| 国产精品yjizz| 欧美一级黄色大片| 午夜宅男久久久| 国产99久久久久久免费看| 欧美日韩另类图片| 欧美一区二区国产| 国内精品久久久久| 在线观看视频网站你懂得| 亚洲高清视频在线播放| 99av国产精品欲麻豆| 亚洲精品日韩综合观看成人91|