当前位置: 首页 > news >正文

第十八:go 并发 goroutine

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()
   }

相关文章:

  • VScode 运行LVGL
  • 前端监测窗口尺寸和元素尺寸变化的方法
  • 【git】【网络】【项目配置运行】HTTP 协议的微型简易 Web 服务器---tinyEasyMuduoWebServer
  • 机器人运动学与动力学
  • 自动驾驶与车路协同
  • 力扣:3305.元音辅音字符串计数
  • Guangzhaotest
  • 动态规划中的自底向上与自顶向下
  • 【A2DP】深入解析A2DP协议中的音频流处理
  • 数字孪生技术在工业制造中的应用探索
  • MongoDB副本集部署完整教程
  • 逐梦DBA:Linux环境下 MySQL 的卸载
  • 嵌入式八股C语言---文件,可执行文件的加载与运行篇
  • MySQL——基础知识
  • 【机器学习-基础知识】统计和贝叶斯推断
  • Flutter_学习记录_device_info_plus 插件获取设备信息
  • 12 | 给应用添加优雅关停功能
  • Webpack 优化深度解析:从构建性能到输出优化的全面指南
  • Vue项目上传到GitHub,vscode拉取vue项目更新后推送到GitHub上
  • vllm.LLM 的参数
  • 韩国执政党总统候选人更换方案被否决,金文洙候选人资格即刻恢复
  • 2025上海十大动漫IP评选活动启动
  • 马上评丨全民定制公交,打开城市出行想象空间
  • 网络主播直播泄机密,别让这些“小事”成威胁国家安全的“突破口”
  • 中国一重集团有限公司副总经理陆文俊被查
  • 江苏省人社厅党组书记、厅长王斌接受审查调查