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

go语言协程之间的同步

前言

Channels 是 Go 语言中用于 协程之间通信的机制。它允许在协程之间发送和接收数据,实现数据同步。

一、channel创建

ch := make(chan int) // 创建一个 int 类型的 channel

二、channel实现数据发送与接收

ch := make(chan int) // 创建一个 int 类型的 channel// 发送数据
go func() {ch <- 42
}()// 接收数据
value := <-ch
fmt.Println(value) // 输出: 42

三、子协程与主协程之间实现同步

package mainimport ("fmt""time"
)// 子协程函数
func produceData(ch chan<- int, done chan<- bool) {for i := 0; i < 5; i++ {ch <- itime.Sleep(500 * time.Millisecond)}close(ch)    // 发送完数据后关闭 channeldone <- true // 通知主协程任务完成
}func main() {dataChannel := make(chan int)doneChannel := make(chan bool)// 启动子协程,调用 produceData 函数go produceData(dataChannel, doneChannel)// 主协程从 dataChannel 中接收数据for value := range dataChannel {fmt.Println("主协程接收到数据:", value)}// 等待子协程通知完成<-doneChannelfmt.Println("子协程已完成,主协程继续执行")
}

子协程和主协程是并行运行的。子协程和主协程分别在不同的执行线程中同时进行操作,使用 <-doneChannel 等待子协程发送完成信号,此时主协程会被阻塞,只有在接收到这个信号后,主协程才会继续执行。确保主协程在子协程完成所有任务后才继续执行,从而实现了同步。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 第十章、 异常Exception
  • 东土科技车规级网络芯片获批量应用
  • leetcode300. 最长递增子序列,动态规划附状态转移方程
  • Android 让程序随系统自动启动并允许后台运行(白名单)
  • arch linux 安装Budgie桌面
  • MySQL约束
  • 一、软件工程概述
  • 网络协议十 应用层 SPDY / HTTP2 / QUIC / HTTP3
  • 使用mybatis注解和xml映射执行javaWeb中增删改查等操作
  • Day18 Linux系统编程学习--文件
  • Java 中的面向对象编程 (OOP) 概念
  • 解析Java中1000个常用类:ListResourceBundle类,你学会了吗?
  • Linux安全与高级应用(十三)深入解析Linux中的rsync远程同步:原理、配置与应用
  • Layui——隐藏表单项后不再进行验证
  • 低代码开发平台:技术概览、效率与质量的权衡及挑战与机遇
  • [deviceone开发]-do_Webview的基本示例
  • Eureka 2.0 开源流产,真的对你影响很大吗?
  • Intervention/image 图片处理扩展包的安装和使用
  • java 多线程基础, 我觉得还是有必要看看的
  • JavaScript异步流程控制的前世今生
  • Vue 2.3、2.4 知识点小结
  • 案例分享〡三拾众筹持续交付开发流程支撑创新业务
  • 实习面试笔记
  • 问:在指定的JSON数据中(最外层是数组)根据指定条件拿到匹配到的结果
  • 学习笔记DL002:AI、机器学习、表示学习、深度学习,第一次大衰退
  • 异步
  • 浅谈sql中的in与not in,exists与not exists的区别
  • ​【C语言】长篇详解,字符系列篇3-----strstr,strtok,strerror字符串函数的使用【图文详解​】
  • ​iOS安全加固方法及实现
  • !! 2.对十份论文和报告中的关于OpenCV和Android NDK开发的总结
  • #我与Java虚拟机的故事#连载07:我放弃了对JVM的进一步学习
  • (01)ORB-SLAM2源码无死角解析-(56) 闭环线程→计算Sim3:理论推导(1)求解s,t
  • (07)Hive——窗口函数详解
  • (20050108)又读《平凡的世界》
  • (a /b)*c的值
  • (Charles)如何抓取手机http的报文
  • (zt)基于Facebook和Flash平台的应用架构解析
  • (附表设计)不是我吹!超级全面的权限系统设计方案面世了
  • (每日一问)操作系统:常见的 Linux 指令详解
  • (每日一问)基础知识:堆与栈的区别
  • (每日一问)计算机网络:浏览器输入一个地址到跳出网页这个过程中发生了哪些事情?(废话少说版)
  • (七)Java对象在Hibernate持久化层的状态
  • *ST京蓝入股力合节能 着力绿色智慧城市服务
  • .NET 反射 Reflect
  • .NET序列化 serializable,反序列化
  • @JSONField或@JsonProperty注解使用
  • [Algorithm][综合训练][kotori和气球][体操队形][二叉树中的最大路径和]详细讲解
  • [Android]使用Git将项目提交到GitHub
  • [AR]Vumark(下一代条形码)
  • [AutoSar]工程中的cpuload陷阱(三)测试
  • [BZOJ1060][ZJOI2007]时态同步 树形dp
  • [C#学习笔记]Newtonsoft.Json
  • [C++][opencv]基于opencv实现photoshop算法色阶调整
  • [C语言]——函数递归
  • [Effective C++读书笔记]0012_复制对象时勿忘其每一部分