waitGroup的使用

package main

import (
    "fmt"
    "sync"
    "time"
)

func main() {
    var wg sync.WaitGroup
    //一個沒有緩衝區的chan
    ch := make(chan string)
    wg.Add(3)
    go sendData(ch, &wg)
    go getData(ch, &wg)
    go getData2(ch, &wg)

    // 等待全部的goroutine都執行完成後才關閉主線程
    time.Sleep(time.Second*3)
    wg.Wait()
    fmt.Printf("main goroutine exited\n")
}

// 若是定義的不是全局的wait group,則在傳值的時候須要傳指針類型
func sendData(ch chan string, waitGroup *sync.WaitGroup) {
    ch <- "aaa"
    ch <- "bbb"
    ch <- "ccc"
    ch <- "ddd"
    ch <- "eee"

    // 關閉chan,即便使用了 waitGroup也須要關閉channel
    // waitGroup只是用於主線程等待goroutine執行完畢
    // channel是一個隊列,用於多個goroutine的通信
    close(ch)
    fmt.Printf("send data exited")
    // 使用 waitGroup給出goroutine的結束信號
    waitGroup.Done()
}

//
func getData(ch chan string, waitGroup *sync.WaitGroup) {
    for {
        input, ok := <-ch
        if !ok {
            break
        }
        fmt.Printf("getData中的input值: %s\n", input)
    }
    fmt.Printf("get data exited\n")
    // 使用 waitGroup給出goroutine的結束信號
    waitGroup.Done()
}

func getData2(ch chan string, waitGroup *sync.WaitGroup) {
    for {
        input2, ok := <-ch
        if !ok {
            break
        }
        fmt.Printf("getData2中的input值:%s\n", input2)
    }
    fmt.Printf("get data2 exited\n")
    // 使用 waitGroup給出goroutine的結束信號
    waitGroup.Done()
}
相關文章
相關標籤/搜索