GoLang協程和管道

1.1~8000查找素數的例子

package main

import "fmt"

// 向intChan放入1-8000個數
func putNum(intChan chan int){
    for i:=1;i<=80000;i++{
        intChan<-i
    }
    // 關閉intChan
    close(intChan)
}

// 從 intChan 取出數據,並且判斷是否爲素數,如果是,就放入到primeChan
func primeNum(intChan chan int,primeChan chan int,exitChan chan bool){
    // 使用for 循環
    var flag bool   // 是否爲素數
    for{
        num,ok :=<-intChan
        if !ok{
            break   // 表示管道已關閉
        }
        flag=true
        for i:=2;i<num;i++{
            if num %i==0{ // 說明不是素數
                flag=false
                break
            }
        }
        if flag{
            primeChan<-num
        }
    }
    fmt.Println("當前協程運行結束")
    exitChan<-true   // 向管道內標誌協程運行結速
}

func main(){
    // 數據管道
    intChan :=make(chan int,1000)
    // 將素數放入該管道
    primeChan :=make(chan int,2000)
    // 每個協程運行結束向該管道內寫入一個bool值
    exitChan :=make(chan bool,4)
    go putNum(intChan)
    for i:=0;i<4;i++{
        // 使用協程找素數
        go primeNum(intChan,primeChan,exitChan)
    }
    go func() {
        for i:=0;i<4;i++{
            <-exitChan
        }
        // 當exitChan 取出了4個協程結束標誌時,可以關閉primeChan管道
        // 表示所有數據查完成,相關協程已運行結束
        close(primeChan)
        // 運行結束管道此時也可以關閉,他的任務已結完成
        close(exitChan)
    }()

    // 主線程遍歷我們的查找的素數結果
    for{
        res,ok :=<-primeChan
        if !ok{
            break
        }
        fmt.Println("素數:",res)
    }
    fmt.Println("程序運行結束~")

}

2. 個人使用引用類型變量來處理了一個程序結束問題

package main

import (
    "fmt"
)

func whriteChanOne(dataChan chan int,voerCode *int){
    for i:=1;i<10000;i++{
        dataChan<- i
        fmt.Println("協程1寫入",i)
    }
    *voerCode++

}
func whriteChanTwo(dataChan chan int,voerCode *int){
    for i:=10000;i<20000;i++{
        dataChan<- i
        fmt.Println("協程2寫入",i)
    }
    *voerCode++

}
func whriteChanThree(dataChan chan int,voerCode *int){
    for i:=20000;i<30000;i++{
        dataChan<- i
        fmt.Println("協程3寫入",i)
    }
    *voerCode++
}
func readChanData(dataChan chan int,readChan chan bool,voerCode *int){
    isClose :=false
    for {
        if *voerCode ==3&&!isClose{
            close(dataChan)
            isClose=true
        }
        v,ok :=<-dataChan
        if !ok{
            readChan<- true
            close(readChan)
            break
        }
        fmt.Println("協程讀取",v)

    }
}

func main()  {
    dataChan :=make(chan int,30000)
    readChan :=make(chan bool,1)
    voerCode :=0
    go whriteChanOne(dataChan,&voerCode)
    go whriteChanTwo(dataChan,&voerCode)
    go whriteChanThree(dataChan,&voerCode)
    go readChanData(dataChan,readChan,&voerCode)
    for {
        _,ok := <-readChan
        if !ok{
            break
        }
    }
    fmt.Println("協程讀取結束")
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章