第十八:go 并发 goroutine

发布于:2025-03-14 ⋅ 阅读:(28) ⋅ 点赞:(0)

channel 可以让多个goroutine 之间实现通信

Add方法调用时机:必须在goroutine 启动之前调用Add方法来增加计数器的值

如果在goroutine已经启动之后再调用Add,可能会导致Wait方法提前返回,因为计数器没有正确反映正在运行的goroutine的数量。把握住:Add()与Wait()保证在同一个函数中

【golang】 WaitGroup使用注意事项_golang sync.waitgroup使用的坑-CSDN博客

package main

import (
	"fmt"
	"sync"
)

// 声明全局等待组变量
var wg sync.WaitGroup

func hello() {
	fmt.Println("hello")
	wg.Done() // 告知当前goroutine完成
}

func main() {
	wg.Add(1) // 登记1个goroutine
	go hello()
	fmt.Println("你好")
	wg.Wait() // 阻塞等待登记的goroutine完成
}

这里定义 wg.add(1000)  这里是事先 先定义好

如果是在 go func(i  int)  里面 就应该是 wg.add(1) ,意思每次循环加1

下面这个实例也是 匿名函数的 goroutine 使用《错误实例》

Add方法调用时机:必须在goroutine 启动之  // 前调用Add方法来增加计数器的值

       var wg sync.WaitGroup
       // 错误示例,在goroutine启动后才调用Add

       // 应该在这里调用 :wg.Add(1)
       go func() {

          wg.Add(1)  // 这个是错误实例 wg.Add(1) Add方法调用时机:必须在goroutine 启动之            
                      // 前调用Add方法来增加计数器的值

          fmt.Println("Goroutine is running")
          wg.Done()
       }()
       wg.Wait()

   package main

   import (
       "fmt"
       "sync"
   )

   func worker(wg *sync.WaitGroup) {
       defer wg.Done()
       fmt.Println("Worker is running")
   }

   func main() {
       var wg sync.WaitGroup
       wg.Add(1)
       // 传递指针
       worker(&wg)
       wg.Wait()
   }