成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

sync.WaitGroup和sync.Once的愛恨情仇

開發 前端
通過本文,我們了解了Go語言中的兩個重要同步工具:?sync.WaitGroup? 和 ?sync.Once?。?sync.WaitGroup? 用于等待一組 goroutine 完成,而 ?sync.Once? 則確保某些操作只執行一次。

今天,我們將繼續探討Go語言中的兩個重要的同步工具:sync.WaitGroup 和 sync.Once。

sync.WaitGroup

sync.WaitGroup 是Go語言中的一種計數信號量,用于等待一組 goroutine 完成。它常用于等待一組并發任務全部完成后再繼續執行。

使用方法

  1. 聲明一個 sync.WaitGroup 類型的變量。
  2. 在每個 goroutine 啟動之前調用 Add 方法,增加等待計數。
  3. 在每個 goroutine 完成時調用 Done 方法,減少等待計數。
  4. 在主 goroutine 中調用 Wait 方法,阻塞直到所有 goroutine 完成。

示例代碼

package main

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

func worker(id int, wg *sync.WaitGroup) {
   defer wg.Done()
   fmt.Printf("Worker %d starting\n", id)
   time.Sleep(time.Second)
   fmt.Printf("Worker %d done\n", id)
}

func main() {
   var wg sync.WaitGroup

   for i := 1; i <= 5; i++ {
       wg.Add(1)
       go worker(i, &wg)
  }

   wg.Wait()
   fmt.Println("All workers done")
}

在這個例子中,main 函數啟動了5個 goroutine,每個 goroutine 都會運行 worker 函數。每個 worker 在完成時調用 wg.Done(),而 main 函數會等待所有 worker 完成后再繼續執行。

注意事項

  • WaitGroup 的計數器不能設為負數,否則會引發 panic。
  • 必須確保在所有 Done 調用之前已經調用了 Add。

sync.Once

sync.Once 是一個用于確保某些操作只執行一次的結構體。它提供了一種線程安全的方式來執行一次性初始化操作。

使用方法

  1. 聲明一個 sync.Once 類型的變量。
  2. 使用 Do 方法執行需要僅執行一次的操作。

示例代碼

package main

import (
   "fmt"
   "sync"
)

func initialize() {
   fmt.Println("Initializing...")
}

func main() {
   var once sync.Once

   for i := 0; i < 10; i++ {
       go func(i int) {
           once.Do(initialize)
           fmt.Printf("Goroutine %d\n", i)
      }(i)
  }

   // 等待所有 goroutine 完成
   var wg sync.WaitGroup
   wg.Add(10)
   for i := 0; i < 10; i++ {
       go func() {
           defer wg.Done()
           once.Do(initialize)
      }()
  }
   wg.Wait()
}

在這個例子中,initialize 函數只會被執行一次,盡管有多個 goroutine 嘗試調用 once.Do(initialize)。

注意事項

  • sync.Once 的 Do 方法接受一個無參函數。
  • 即使 Do 方法被多次調用,傳入的函數也只會執行一次。

結合使用示例

我們可以結合 sync.WaitGroup 和 sync.Once,來完成一個更復雜的并發任務。假設我們有一個初始化操作,只需執行一次,但在多個 goroutine 中執行其他任務。

示例代碼

package main

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

var (
   once sync.Once
   wg   sync.WaitGroup
)

func initialize() {
   fmt.Println("Initializing...")
   time.Sleep(2 * time.Second) // 模擬初始化耗時
   fmt.Println("Initialization complete")
}

func worker(id int) {
   defer wg.Done()
   once.Do(initialize)
   fmt.Printf("Worker %d starting\n", id)
   time.Sleep(time.Second) // 模擬工作
   fmt.Printf("Worker %d done\n", id)
}

func main() {
   const numWorkers = 5
   wg.Add(numWorkers)

   for i := 1; i <= numWorkers; i++ {
       go worker(i)
  }

   wg.Wait()
   fmt.Println("All workers done")
}

在這個例子中,initialize 函數只會執行一次,而 worker 函數會并發執行,等待所有 worker 完成后,程序才會繼續執行。

總結

通過本文,我們了解了Go語言中的兩個重要同步工具:sync.WaitGroup 和 sync.Once。sync.WaitGroup 用于等待一組 goroutine 完成,而 sync.Once 則確保某些操作只執行一次。這兩個工具在實際開發中非常實用,能有效地幫助我們處理并發任務。

責任編輯:武曉燕 來源: 架構師秋天
相關推薦

2024-01-08 13:40:00

并發安全? 數量

2021-08-29 18:13:03

緩存失效數據

2023-06-05 09:23:00

Golang同步工具

2023-10-20 13:35:19

GoWaitGroup

2023-06-06 08:28:58

Sync.OnceGolang

2023-03-28 08:20:07

場景sync.Once?系統

2022-09-02 12:13:22

TCPUDP場景

2025-01-03 09:39:04

2022-05-13 09:47:28

Docker容器

2021-04-12 06:08:16

HiveSpark大數據

2020-11-24 10:13:20

測試開發管理

2019-05-15 15:10:12

Tomcat Session Cookie

2024-08-07 08:22:27

2022-06-07 08:55:04

Golang單例模式語言

2025-03-24 00:25:00

Go語言并發編程

2025-04-03 09:12:26

GolangWaitGroup工具

2024-06-07 00:09:50

2025-01-13 00:00:35

2011-08-15 14:06:28

sync中文man

2013-02-20 10:00:16

微軟CodePlexGitHub
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 丁香婷婷综合激情五月色 | 国产农村一级片 | 一区二区三区国产精品 | 亚洲精品短视频 | 国产精品国产精品国产专区不蜜 | 久久亚洲一区二区 | 人人干人人干人人干 | 国产精品亚洲一区二区三区在线观看 | 自拍 亚洲 欧美 老师 丝袜 | 亚洲啊v在线| 在线视频日韩 | 婷婷开心激情综合五月天 | www四虎影视 | 9久久精品 | 亚洲精品综合一区二区 | 久久久看 | 亚洲成人av在线 | 亚洲影音 | 久久免费精品视频 | 欧美精品v| 日本人做爰大片免费观看一老师 | 国产精品美女久久久 | 不卡一区二区在线观看 | 欧美日韩综合视频 | 日韩伦理一区二区 | 欧美精品久久久久 | 久久国产精品-国产精品 | 999久久久| 欧美一级二级在线观看 | 国产91视频播放 | 欧美亚洲视频 | 成人一区二区三区 | www.久久 | 久久精品二区 | 91成人精品 | 国产成人精品999在线观看 | 国产成人精品免费 | 久久婷婷色 | 懂色av一区二区三区在线播放 | 精品一区国产 | 亚洲九色|