Go语言 gorutine和channel协同工作经典应用案例


案例:

思路分析:

代码实现:

package main

import "fmt"

func writeData(intChan chan int) {
    for i := 1; i <= 50; i++ {
        intChan <-i//放入数据
        fmt.Println("writeData",i)
    }
    close(intChan)
}
func readData(intChan chan int, exitChan chan bool)  {
    for{
        v, ok := <-intChan
        if !ok{
            break
        }
        fmt.Printf("readData 读到数据=%v\n", v)
    }
    exitChan<- true
    close(exitChan)
}

func main() {
    //创建两个管道
    intChan := make(chan int, 50)
    exitChan := make(chan bool, 1)

    go writeData(intChan)
    go readData(intChan,exitChan)

    for{
        _, ok := <-exitChan
        if !ok{
            break
        }
    }
}

执行结构如下图:

读和写,频率不一样,也没有问题,代码如下:

package main

import (
    "fmt"
    "time"
)

func writeData(intChan chan int) {
    for i := 1; i <= 50; i++ {
        intChan <-i//放入数据
        fmt.Println("writeData",i)
    }
    close(intChan)
}
func readData(intChan chan int, exitChan chan bool)  {
    for{
        v, ok := <-intChan
        if !ok{
            break
        }
        time.Sleep(time.Second)
        fmt.Printf("readData 读到数据=%v\n", v)
    }
    exitChan<- true
    close(exitChan)
}

func main() {
    //创建两个管道
    intChan := make(chan int, 10)
    exitChan := make(chan bool, 1)

    go writeData(intChan)
    go readData(intChan,exitChan)

    for{
        _, ok := <-exitChan
        if !ok{
            break
        }
    }
}

执行结果如下:

注意:如果只向管道写入数据,而没有读取,就会出现阻塞而deadlock。

Go语言 gorutine和channel协同工作经典应用案例介绍到这里,更多Go学习请参考编程字典Go教程 和问答部分,谢谢大家对编程字典的支持。


原文链接:https://blog.csdn.net/cui_yonghua/article/details/94720208?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522163523372016780265481777%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=163523372016780265481777&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_v2~rank_v29-10-94720208.pc_v2_rank_blog_default&utm_term=go&spm=1018.2226.3001.4450