最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Golang利用channel協(xié)調(diào)協(xié)程的方法詳解

 更新時間:2023年05月25日 08:21:28   作者:JetTsang  
go?當中的并發(fā)編程是通過goroutine來實現(xiàn)的,利用channel(管道)可以在協(xié)程之間傳遞數(shù)據(jù),所以本文就來講講Golang如何利用channel協(xié)調(diào)協(xié)程吧

前言

go 當中的并發(fā)編程是通過goroutine來實現(xiàn)的,利用channel(管道)可以在協(xié)程之間傳遞數(shù)據(jù),實現(xiàn)協(xié)程的協(xié)調(diào)與同步。

使用

新建一個管道,使用make channel 來構建

// 構建一個緩存長度為8 的管道
ch := make(chan int ,8)
// 寫入
ch <- 10
// 取出
number := <-ch
// 關閉
close(ch)

注意: 取數(shù)據(jù)的時候,如果沒得取,會阻塞代碼的執(zhí)行,如果一直沒有取到,那就是死鎖

實現(xiàn)生產(chǎn)者消費者模式

兩個生產(chǎn)者者協(xié)程和一個消費者協(xié)程

使用waitGroup

func main() {  
    ch := make(chan int, 100)  
    wg := sync.WaitGroup{}  
    wg.Add(2)  
    // 生產(chǎn)者
    go func() {  
        defer wg.Done()  
        // 寫入數(shù)據(jù)  
        for i := 0; i < 10; i++ {  
            ch <- i  
        }  
    }()  
    // 生產(chǎn)者
    go func() {  
        defer wg.Done()  
        // 寫入數(shù)據(jù)  
        for i := 0; i < 10; i++ {  
            ch <- i  
        }  
    }()  
    wg2 := sync.WaitGroup{}  
    wg2.Add(1)  
    // 消費者
    go func() {  
        sum := 0  
        fmt.Printf("sum %d \n", sum)  
        for {  
            // 這里會等待  
            temp, ok := <-ch  
            // close 并且 管道為空,ok = false  
            if !ok {    
                break  
            } else {  
                sum += temp  
            }  
        }  
        fmt.Printf("sum %d \n", sum)  
        wg2.Done()  
    }()  
    // 等待倆生產(chǎn)者結束  
    wg.Wait()  
    // 生產(chǎn)數(shù)據(jù)之后,消費者也并行讀完了,此時可以關閉 管道 來 跳出for循環(huán)了 
    close(ch)  
    // 等待消費者協(xié)程結束  
    wg2.Wait()  
}

使用管道則將wg2相關的代碼改掉

func main() {  
    //... 
    //...
    ch2 := make(chan struct{}, 0)  
    go func() {  
        sum := 0  
        fmt.Printf("sum %d \n", sum)  
        for {  
            // 這里會等待  
            temp, ok := <- ch  
            // close 并且 管道為空,ok = false  
            if !ok {  
                break  
            } else {  
                sum += temp  
            }  
        }  
        fmt.Printf("sum %d \n", sum)  
        ch2 <- struct{}{}  
    }()  
    // 等待倆生產(chǎn)者結束  
    wg.Wait()  
    // 關閉管道
    close(ch)  
    // 等待消費者協(xié)程結束  
    <-ch2
}

實戰(zhàn)面試題: 「交替打印數(shù)字和字母」

題目

使用兩個 goroutine 交替打印序列,一個 goroutine 打印數(shù)字, 另外一個 goroutine 打印字母, 最終效果如下:

12AB34CD56EF78GH910IJ1112KL1314MN1516OP1718QR1920ST2122UV2324WX2526YZ2728

解題思路

利用channel的 阻塞 來協(xié)調(diào)線程,達到線程交叉執(zhí)行的效果。

代碼

func main() {  
    letter, number := make(chan bool), make(chan bool)  
    wait := sync.WaitGroup{}  
    go func() {  
        i := 1  
        for {  
            if <-number {  
                fmt.Print(i)  
                i++  
                fmt.Print(i)  
                i++  
                letter <- true  
            }  
        }  
    }()  
    wait.Add(1)  
    go func() {  
        // 獲得ASCII碼  
        i := 'A'  
        for {  
            if <-letter {  
                // 當前已經(jīng)超過Z時,無需再打印
                if i > 'Z' {  
                    // 停止等待,并且跳出循環(huán)
                    wait.Done()  
                    break  
                }  
                // 將ASCII碼強轉成字母輸出  
                fmt.Print(string(i))  
                i++  
                fmt.Print(string(i))  
                i++  
                number <- true  
            }  
        }  
    }()  
    // 放行數(shù)字打印的阻塞 
    number <- true  
    // 等待關閉主線程
    wait.Wait()  
}

其實完全也可以將waitGroup換成管道

func main() {  
    letter, number := make(chan bool), make(chan bool)  
    // 再定義一個管道來等待,替代waitGroup的作用
    wait := make(chan bool)
    // 打印數(shù)字
    go func() {  
        i := 1  
        for {  
            if <-number {  
                fmt.Print(i)  
                i++  
                fmt.Print(i)  
                i++  
                letter <- true  
            }  
        }  
    }()  
    // 打印字母
    go func() {  
        // 獲得ASCII碼  
        i := 'A'  
        for {  
            if <-letter {  
                if i > 'Z' {  
                    wait <- true  
                    break  
                }  
                // 將ASCII碼強轉成字母輸出  
                fmt.Print(string(i))  
                i++  
                fmt.Print(string(i))  
                i++  
                number <- true  
            }  
        }  
    }()  
    number <- true  
    // 等待管道取值
    <- wait 
}

到此這篇關于Golang利用channel協(xié)調(diào)協(xié)程的方法詳解的文章就介紹到這了,更多相關Golang channel協(xié)調(diào)協(xié)程內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Go語言學習之將mp4通過rtmp推送流媒體服務的實現(xiàn)方法

    Go語言學習之將mp4通過rtmp推送流媒體服務的實現(xiàn)方法

    對音視頻一直是小白,決定沉下心來,好好研究一下音視頻知識,下面這篇文章主要給大家介紹了關于Go語言學習之將mp4通過rtmp推送流媒體服務的實現(xiàn)方法,需要的朋友可以參考下
    2022-12-12
  • Go語言學習筆記之文件讀寫操作詳解

    Go語言學習筆記之文件讀寫操作詳解

    這篇文章主要為大家詳細介紹了Go語言對文件進行讀寫操作的方法,文中的示例代碼講解詳細,對我們學習Go語言有一定的幫助,需要的可以參考一下
    2022-05-05
  • Golang使用Zookeeper實現(xiàn)分布式鎖

    Golang使用Zookeeper實現(xiàn)分布式鎖

    分布式鎖是一種在分布式系統(tǒng)中用于控制并發(fā)訪問的機制,ZooKeeper?和?Redis?都是常用的實現(xiàn)分布式鎖的工具,本文就來使用Zookeeper實現(xiàn)分布式鎖,希望對大家有所幫助
    2024-02-02
  • Go生成base64圖片驗證碼實例(超詳細工具類)

    Go生成base64圖片驗證碼實例(超詳細工具類)

    這段時間需要使用圖片驗證碼庫,下面這篇文章主要給大家介紹了關于Go生成base64圖片驗證碼的相關資料,文中給出了詳細的實例代碼,需要的朋友可以參考下
    2023-06-06
  • Golang 負載均衡算法實現(xiàn)示例

    Golang 負載均衡算法實現(xiàn)示例

    在Go語言中,負載均衡算法通常由代理、反向代理或者應用層負載均衡器來實現(xiàn),在這些實現(xiàn)中,有一些經(jīng)典的負載均衡算法,跟隨本文來一一探究
    2024-01-01
  • Go實現(xiàn)文件分片上傳

    Go實現(xiàn)文件分片上傳

    這篇文章主要為大家詳細介紹了Go實現(xiàn)文件分片上傳,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-07-07
  • Go+Redis實現(xiàn)延遲隊列實操

    Go+Redis實現(xiàn)延遲隊列實操

    這篇文章主要介紹了Go+Redis實現(xiàn)延遲隊列實操,延遲隊列是一種非常使用的數(shù)據(jù)結構,我們經(jīng)常有需要延遲推送處理消息的場景,比如延遲60秒發(fā)送短信,延遲30分鐘關閉訂單,消息消費失敗延遲重試等
    2022-09-09
  • go 生成器模式的具體使用

    go 生成器模式的具體使用

    生成器是一種創(chuàng)建型設計模式,使你能夠分步驟創(chuàng)建復雜對象,本文主要介紹了go生成器模式的具體使用,具有一定的參考價值,感興趣的可以了解一下
    2024-01-01
  • Go語言單元測試的實現(xiàn)及用例

    Go語言單元測試的實現(xiàn)及用例

    在日常開發(fā)中,我們通常需要針對現(xiàn)有的功能進行單元測試,以驗證開發(fā)的正確性,本文主要介紹了Go語言單元測試的實現(xiàn)及用例,具有一定的參考價值,感興趣的可以了解一下
    2024-01-01
  • Golang接入釘釘通知的示例代碼

    Golang接入釘釘通知的示例代碼

    本文主要介紹了Golang接入釘釘通知的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-08-08

最新評論

佛山市| 长岛县| 闸北区| 社会| 利津县| 贵阳市| 新建县| 嘉义县| 乌审旗| 将乐县| 三亚市| 静安区| 虞城县| 法库县| 邵阳市| 盈江县| 拉萨市| 乐至县| 海南省| 福建省| 开平市| 清镇市| 荆门市| 阿拉善左旗| 平邑县| 菏泽市| 灌阳县| 云林县| 陆河县| 屯门区| 资中县| 古交市| 平南县| 台中市| 宿迁市| 津市市| 汉川市| 乐陵市| 罗甸县| 天峨县| 南召县|