免费观看又色又爽又黄的小说免费_美女福利视频国产片_亚洲欧美精品_美国一级大黄大色毛片

Golang中怎么實(shí)現(xiàn)并發(fā)編程

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

創(chuàng)新互聯(lián)專注為客戶提供全方位的互聯(lián)網(wǎng)綜合服務(wù),包含不限于成都網(wǎng)站設(shè)計、網(wǎng)站制作、永新網(wǎng)絡(luò)推廣、小程序設(shè)計、永新網(wǎng)絡(luò)營銷、永新企業(yè)策劃、永新品牌公關(guān)、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運(yùn)營等,從售前售中售后,我們都將竭誠為您服務(wù),您的肯定,是我們最大的嘉獎;創(chuàng)新互聯(lián)為所有大學(xué)生創(chuàng)業(yè)者提供永新建站搭建服務(wù),24小時服務(wù)熱線:18982081108,官方網(wǎng)址:m.newbst.com

關(guān)于進(jìn)程、線程和協(xié)程的區(qū)別

  • 進(jìn)程是“程序執(zhí)行的一個實(shí)例” ,擔(dān)當(dāng)分配系統(tǒng)資源的實(shí)體。進(jìn)程創(chuàng)建必須分配一個完整的獨(dú)立地址空間。進(jìn)程切換只發(fā)生在內(nèi)核態(tài)。

  • 線程:線程是進(jìn)程的一個執(zhí)行流,獨(dú)立執(zhí)行它自己的程序代碼,是程序執(zhí)行流的最小單元,是處理器調(diào)度和分派的基本單位。一個進(jìn)程可以有一個或多個線程。

  • 協(xié)程:協(xié)程不是進(jìn)程或線程,其執(zhí)行過程更類似于子例程,或者說不帶返回值的函數(shù)調(diào)用。在語言級別可以創(chuàng)建并發(fā)協(xié)程,然后編寫代碼去進(jìn)行管理。Go 將這一步承包下來,使協(xié)程并發(fā)運(yùn)行成本更低。

Golang 中怎么實(shí)現(xiàn)并發(fā)編程

Go 實(shí)現(xiàn)最簡單的并發(fā)

for i := 0; i < 10; i++ {
    go func(n int) {
        fmt.Println(n)
    }(i)
}

項目實(shí)踐

最近有個項目需要同時調(diào)用多個 job,并要等待這些 job 完成之后才能往下執(zhí)行。

串行執(zhí)行 job

最開始,我們擁有一個執(zhí)行 job 的方法,并且串行執(zhí)行所有的 job:

func buildJob(name string) {
    ...
}

buildJob("A")
buildJob("B")
buildJob("C")

并行執(zhí)行 job

因?yàn)樗?job 是可以并發(fā)執(zhí)行的,這樣就不用必須等待上一個 job 執(zhí)行完成后,才能繼續(xù)執(zhí)行其他 job。我們可以使用 Go 語言的關(guān)鍵字 go 來快速啟用一個 goroutine,下面我們將并發(fā)地執(zhí)行三個 job:

go buildJob("A")
go buildJob("B")
go buildJob("C")

等待所有 job 完成

怎樣才能知道每個 job 是否已經(jīng)完成,這里可以使用 channel 進(jìn)行通信,并使用 select 檢查執(zhí)行結(jié)果:

func buildJob(ch chan error, name string) {
    var err error
    
    ... // build job
    
    ch <- err // finnaly, send the result into channel
}

func build() error {
    jobCount := 3
    errCh := make(err chan error, jobCount)
    defer close(errCh) // 關(guān)閉 channel

    go buildJob(errCh, "A")
    go buildJob(errCh, "B")
    go buildJob(errCh, "C")

    for {
        select {
        case err := <-ch:
            if err != nil {
                return err
            }
        }
        
        jobCount--
        if jobCount <= 0 {
            break
        }
    }
    
    return nil
}

發(fā)現(xiàn)問題

當(dāng) job A 執(zhí)行失敗時,build 方法會 return err 退出,并執(zhí)行 close(errCh)??墒谴藭r另外兩個 job B 和 C 可能還沒執(zhí)行完成,同時也會把結(jié)果發(fā)給 errCh,但由于這個時候 errCh 已經(jīng)被關(guān)閉了,會導(dǎo)致程序退出 panic: send on closed channel。

優(yōu)化代碼

在給 channel 發(fā)送數(shù)據(jù)的時候,可以使用接收數(shù)據(jù)的第二個值判斷 channel 是否關(guān)閉:

func buildJob(ch chan error, name string) {
    var err error
    
    ... // build job
    
    if _, ok := <-ch; !ok {
        return
    }
    ch <- err // finnaly, send the result into channel
}

func build() error {
    jobCount := 3
    errCh := make(err chan error, jobCount)
    defer close(errCh) // 關(guān)閉 channel

    go buildJob(errCh, "A")
    go buildJob(errCh, "B")
    go buildJob(errCh, "C")

    for {
        select {
        case err := <-ch:
            if err != nil {
                return err
            }
        }
        
        jobCount--
        if jobCount <= 0 {
            break
        }
    }
    
    return nil
}

上述就是小編為大家分享的Golang 中怎么實(shí)現(xiàn)并發(fā)編程了,如果剛好有類似的疑惑,不妨參照上述分析進(jìn)行理解。如果想知道更多相關(guān)知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。

分享文章:Golang中怎么實(shí)現(xiàn)并發(fā)編程
文章出自:http://m.newbst.com/article14/gsejde.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供云服務(wù)器網(wǎng)站維護(hù)、建站公司搜索引擎優(yōu)化、域名注冊、網(wǎng)站營銷

廣告

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

h5響應(yīng)式網(wǎng)站建設(shè)