iT邦幫忙

2023 iThome 鐵人賽

DAY 17
0
Cloud Native

【하나, 둘, ready, get set, go】系列 第 17

【하나, 둘, ready, get set, go】Day 17 - sync (上)

  • 分享至 

  • xImage
  •  

前情提要

昨天介紹完使用 channels 來達成 Goroutines,接著要來介紹如何使用 sync 來達成 Goroutines

sync 會用兩天的篇幅來介紹,今天要介紹的是 sync.WaitGroup

就讓我們實際用看看吧

實際操作

語法

// 宣告 sync.WaitGroup 變數
var wg sync.WaitGroup

// 告訴系統說,總共有幾個 Goroutines 要執行
wg.Add(<要新增 Goroutines 的數量>)

// 告訴系統說,Goroutines 執行完成了
wg.Done()

// 告訴系統說,要等待 Goroutines 全部執行完成,才能做後面的事情
wg.Wait()

Example

var wg sync.WaitGroup

wg.Add(2)

wg.Done()

wg.Wait()

用 sync.WaitGroup 改寫 Day 15 的 A Tour of Go 範例

我們一樣用 Day 15 介紹的 A Tour of Go 上的官方範例來進行改寫

package main

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

var wg sync.WaitGroup

func say(s string) {
    for i := 0; i < 5; i++ {
        time.Sleep(100 * time.Millisecond)
        fmt.Println(s)
    }
    wg.Done()
}

func main() {
    wg.Add(2)
    
    go say("world")
    go say("hello")
    
    wg.Wait()
}

下面就來講解用 sync.WaitGroup 改寫後的 Code

sync.WaitGroup

  1. import sync package,因為我們要用的 sync.WaitGroup 在這個 package 內 -> Line 5
  2. 宣告 sync.WaitGroup 變數 wg -> Line 9

func say(s string)

  1. 在執行完輸出後,新增 wg.Done(),告訴系統說,這個 Goroutines 執行完成了 -> Line 16

func main()

  1. 告訴系統說,總共有幾個 Goroutines 要執行,這邊一共有兩個,所以就是 wg.Add(2) -> Line 20
  2. 執行兩個 Goroutines function -> Line 22~23
  3. 告訴系統說,要等待所有 Goroutines 都執行完成後,才能繼續往下執行後面的事 -> Line 25

總結

今天簡單介紹了 Goroutines 中的 sync.WaitGroup 用法

個人覺得用起來跟 Swift 中的 DispatchGroup 有一點點像

明天要來介紹 sync 的另外一個用法,sync.Mutex

明天見~


上一篇
【하나, 둘, ready, get set, go】Day 16 - channels
下一篇
【하나, 둘, ready, get set, go】Day 18 - sync (下)
系列文
【하나, 둘, ready, get set, go】30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言