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

【golang】匿名内部协程,值传递与参数传递

代码例子

下面代码的区别是直接调用循环变量,这里使用的就是这个变量的引用,而不是将参数的副本传递给协程执行

for task := range taskChan {wg.Add(1)go func() {defer wg.Done()task.Do()  // 使用外部循环变量}()
}
func DistributeTasks(taskChan <-chan *AddTask, resChan chan int) {var wg sync.WaitGroupfor task := range taskChan {wg.Add(1)go func(t *AddTask) {defer wg.Done()t.Do()}(task) // 注意要当作参数传入,而不是直接在 开启的协程 内部调用task,}wg.Wait()close(resChan)
}

结论

  • 可能导致的问题:
    • 在 Go 语言中,当你使用 go 关键字启动一个 goroutine 时,它会在一个新的并发执行单元中运行。在原始代码中,将 task 作为参数传递给匿名函数,确保了每个 goroutine 操作的 task 是独立的,因为函数参数是按值传递的,这意味着在 go 语句执行时,会将 task 的副本传递给匿名函数。
    • 如果不将 task 作为参数传递,而是直接在匿名协程 goroutine 中调用 task,由于 goroutine 可能会在 for 循环的下一次迭代开始后才开始执行,而 for 循环会不断更新 task 的值,这可能会导致 goroutine 看到的 task 值不是你期望的那个。
    • 例如:goroutine执行时间很长,而程序中开启goroutine是一个很快的过程,开启完毕之后就执行下一次for循环了,循环变量task也就变了,之前开启的goroutine执行到task.Do() 的时候,已经是其他次循环的task变量
for task := range taskChan {wg.Add(1)go func() {defer wg.Done()//假如这里有比较久的耗时操作task.Do()  // 使用外部循环变量,这时候可能已经当时那一次循环的task了,因为开启协程这段代码一下子就执行完毕}()
}
http://www.lryc.cn/news/503884.html

相关文章:

  • Jenkins与SonarQube持续集成搭建及坑位详解
  • .NET6 WebAPI从基础到进阶--朝夕教育
  • 购物车案例--分模块存储数据,发送请求数据渲染,底部总计数量和价格
  • PCIe学习笔记
  • The Rise and Potential of Large Language ModelBased Agents:A Survey---讨论
  • C语言:const的用法
  • Redis - 集合 Set 及代码实战
  • LabVIEW面向对象编程有什么特点?
  • 配置Nginx自签名SSL证书,支持HTTPS
  • 使用Spring Boot、VUE实现SSE长连接:跟踪文件上传和任务进度
  • 计算机网络技术基础:3.计算机网络的拓扑结构
  • go-zero(十二)消息队列
  • 会议通知:人工智能通识教育与实践发展暨和鲸科技AI通识课解决方案发布会
  • UDS自动化测试-Service 0x27(CAPL调用dll实现key计算)
  • 订单编号如何实现
  • Vue3 大事件管理系统
  • IOS通过WDA自动化中遇到的问题
  • 单独测试 pyautogui 的鼠标点击功能,确保它能够在当前环境中正常工作,鼠标自动点击的录制回放功能
  • 路由引入问题(双点双向路由回馈问题)
  • 设计模式之 适配器模式 C# 范例
  • LabVIEW实现GPS通信
  • [leetcode100] 543. 二叉树的直径
  • 嵌入式学习(18)-stm32F407串口接收空闲中断+DMA
  • b站视频爬虫-词云分析
  • 如何防止订单二次重复支付?
  • LeetCode 24反转链表
  • 用python的flask写的一个MQTT中转功能,http的方式发送数据和接收数据
  • img引入svg如何修改颜色
  • 计算机毕业设计PySpark+PyFlink+Hive地震预测系统 地震数据分析可视化 地震爬虫 大数据毕业设计 Hadoop 机器学习 深度学习
  • 【Python】使用Numpy实现余弦相似度计算