10.3 Go 同步与通信


在这里插入图片描述
💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。
在这里插入图片描述

  • 推荐:「stormsha的主页」👈,持续学习,不断总结,共同进步,为了踏实,做好当下事儿~

  • 专栏导航

    • Python系列: Python面试题合集,剑指大厂
    • Git系列: Git操作技巧
    • GO系列: 记录博主学习GO语言的笔记,该笔记专栏尽量写的试用所有入门GO语言的初学者
    • 数据库系列: 详细总结了常用数据库 mysql 技术点,以及工作中遇到的 mysql 问题等
    • 运维系列: 总结好用的命令,高效开发
    • 算法与数据结构系列: 总结数据结构和算法,不同类型针对性训练,提升编程思维

    非常期待和您一起在这个小小的网络世界里共同探索、学习和成长。💝💝💝 ✨✨ 欢迎订阅本专栏 ✨✨

    💖The Start💖点点关注,收藏不迷路💖

    📒文章目录

      • Goroutine:轻量级的并发
        • 技巧 1:合理使用 Goroutines
        • 技巧 2:利用 WaitGroup 同步 Goroutines
      • Channels:Go 语言的通信机制
        • 技巧 3:使用 Buffered Channels 控制数据流
        • 技巧 4:利用 Channels 实现同步
        • 技巧 5:使用 Select 进行多路复用
      • 错误处理与超时
        • 技巧 6:使用 ErrGroup 处理并发错误
        • 技巧 7:设置超时控制
      • 总结


内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容
在 Go 语言的并发编程中,同步和通信是构建高效、稳定程序的关键。Go 通过 goroutines 和 channels 为开发者提供了一套简洁而强大的并发模型。本文将深入探讨 Go 中的同步与通信机制,分享一些使用技巧,旨在帮助开发者更好地理解和应用这些概念。

Goroutine:轻量级的并发

Go 语言的 goroutines 是实现并发的基石。它们是轻量级的线程,由 Go 运行时管理,可以在用户级别进行调度。Goroutine 的创建非常简单,只需要使用 go 关键字:

go myFunction()

技巧 1:合理使用 Goroutines

虽然 goroutines 可以轻松创建,但过多的 goroutines 会消耗系统资源。合理控制 goroutines 的数量,避免不必要的并发,可以提高程序的性能。

技巧 2:利用 WaitGroup 同步 Goroutines

当需要等待多个 goroutines 完成时,可以使用 sync.WaitGroup。它允许你等待一组 goroutines 完成它们的任务:

var wg sync.WaitGroupfor _, task := range tasks {go func() {defer wg.Done()processTask(task)}()
}wg.Wait() // 等待所有 goroutines 完成

Channels:Go 语言的通信机制

Channels 是 Go 语言中实现 goroutines 间通信的机制。它们可以传递数据,并支持同步操作。

技巧 3:使用 Buffered Channels 控制数据流

Channels 可以是带缓冲的,这意味着它们可以存储一定数量的值,直到被读取。使用带缓冲的 channels 可以控制数据流,防止生产者过快地生成数据,而消费者跟不上:

ch := make(chan int, 10) // 创建一个缓冲大小为 10 的 channel

技巧 4:利用 Channels 实现同步

Channels 不仅可以用来传递数据,还可以用来同步 goroutines。例如,使用 channels 来实现一个 barrier,等待所有 goroutines 到达某个点:

done := make(chan bool)
for i := 0; i < 5; i++ {go func() {// 执行一些任务<-done // 等待信号}()
}
close(done) // 发送信号,所有 goroutines 将被解锁

技巧 5:使用 Select 进行多路复用

select 语句允许你同时等待多个 channel 操作,这在处理多个 goroutines 间的通信时非常有用:

select {
case msg := <-ch1:handle(ch1, msg)
case msg := <-ch2:handle(ch2, msg)
default:handleDefault()
}

错误处理与超时

在并发编程中,错误处理和超时控制是必不可少的。

技巧 6:使用 ErrGroup 处理并发错误

errgroup.Group 是一个处理一组 goroutines 并收集它们错误的方法。当其中一个 goroutine 返回错误时,errgroup 会取消其他所有 goroutines 并返回第一个遇到的错误:

eg := errgroup.Group{}
for _, task := range tasks {eg.Go(func() error {return processTask(task)})
}
if err := eg.Wait(); err != nil {log.Fatal(err)
}

技巧 7:设置超时控制

在某些情况下,你可能需要对 goroutine 的执行设置超时。这可以通过组合 channels 和 time. After 来实现:

timeout := time.After(5 * time.Second)
select {
case result := <-taskChannel:handleResult(result)
case <-timeout:log.Println("Operation timed out")
}

总结

Go 语言的并发模型以其简单性和效率而闻名。通过合理使用 goroutines 和 channels,开发者可以构建出既快速又可靠的并发程序。本文介绍的技巧和最佳实践可以帮助开发者更深入地理解 Go 的同步与通信机制,并在实际开发中运用这些知识。

记住,同步和通信是并发编程的核心,正确地使用它们可以极大地提升程序的性能和稳定性。希望本文能够帮助你更有效地使用 Go 语言进行并发编程。


🔥🔥🔥道阻且长,行则将至,让我们一起加油吧!🌙🌙🌙

💖The End💖点点关注,收藏不迷路💖

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/347623.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Yapi代码执行 waf绕过实战记录

本文记录了2021年一次有趣的客户目标测试实战。这次经历颇为特别&#xff0c;因此我将其整理成笔记&#xff0c;并在此分享&#xff0c;希望对大家有所帮助。 事件起因 疫情在家办公&#xff0c;准备开始划水的一天&#xff0c;这时接到 boss 的电话说要做项目&#xff0c;老…

环艺转行AI产品经理,这一世我要选择朝阳赛道!

选建筑学初衷 在大一设计专业分流前&#xff0c;我的意向专业是产品与环艺&#xff0c;然后那个时候去学院各自试了一下课&#xff0c;感觉自己还是蛮喜欢“建房子”的&#xff0c;因为从零到一慢慢设计出自己喜欢的空间是一件很美好的事情&#xff0c;造物感与成就感非常强烈…

各类电机数学模型相关公式总结 —— 集成芯片驱动

0、背景技术概述 永磁直流电机&#xff08;PMDC&#xff09;、永磁同步电机&#xff08;PMSM&#xff09;、无刷直流电机&#xff08;BLDC&#xff09;以及混合式两相步进电机在小功率应用场景中多采用集成芯片驱动&#xff08;如二合一、三合一驱动芯片&#xff09;的原因主要…

FPGA - 全局时钟资源

全局时钟资源是指FPGA内部为实现系统时钟到达FPGA内部各 CLB、IOB&#xff0c;以及BSRAM&#xff08;Block Select RAM&#xff0c;选择性BRAM&#xff09;等基本逻辑单元的延时和抖动最小化&#xff0c;采用全铜层工艺设计和实现的专用缓冲与驱动结构。 由于全局时钟资源的布线…

水产养殖监测站的工作原理

TH-LSZ06水产养殖监测站是保障水产质量安全的重要设施&#xff0c;监测水产养殖环境&#xff1a;负责监测水产养殖基地的水质、底泥、养殖物质等&#xff0c;确保养殖环境的适宜性和安全性。通过对养殖环境的实时监测&#xff0c;可以及时发现和预警水产疾病和污染问题&#xf…

新书速览|Autodesk Inventor 2024入门与案例实战:视频教学版

《Autodesk Inventor 2024入门与案例实战&#xff1a;视频教学版》 本书内容 《Autodesk Inventor 2024入门与案例实战&#xff1a;视频教学版》以Autodesk Inventor 2024为平台&#xff0c;重点介绍Autodesk Inventor 2024中文版的各种操作方法及其在工程设计领域的应用。《Au…

pdf压缩文件怎么压缩最小,软件工具压缩清晰

PDF格式的文件&#xff0c;当其体积过于庞大时&#xff0c;确实在上传的过程中显得尤为不便。今天给大家分享一个压缩pdf的简单的方法&#xff0c;让大家可以轻松的压缩pdf。 浏览器打开 "轻云处理pdf官网" &#xff0c;上传pdf文件&#xff0c;文件上传完成后网站会…

Spring Boot整合Redis通过Zset数据类型+定时任务实现延迟队列

&#x1f604; 19年之后由于某些原因断更了三年&#xff0c;23年重新扬帆起航&#xff0c;推出更多优质博文&#xff0c;希望大家多多支持&#xff5e; &#x1f337; 古之立大事者&#xff0c;不惟有超世之才&#xff0c;亦必有坚忍不拔之志 &#x1f390; 个人CSND主页——Mi…

10倍加速!揭秘IDM下载器的惊人秘密!

在数字化时代的浪潮下&#xff0c;互联网下载工具的多样性使得用户在选择时往往感到迷茫。其中&#xff0c;Internet Download Manager&#xff08;IDM&#xff09;作为一款高效的下载管理工具&#xff0c;因其加速下载、支持多线程下载和恢复中断下载等功能而受到广泛关注。然…

中仕公考:博士考公务员能免笔试吗?

博士学历的考生&#xff0c;无论是选择报考公务员还是事业单位&#xff0c;都必须经过正规的选拔过程。根据当前规定&#xff0c;所有体制内职位均须通过相应的考试方可入职&#xff0c;除非考生在高考时已选定定向招聘岗位。 博士毕业生如果想成为公务员&#xff0c;必须参加…

【原创教程】三菱Q与MERLIN II LS激光打标机控制说明

一、控制流程说明 1.硬件连接→2.软件通讯连接→3.编写远程控制PLC程序→4.编写通讯命令。 二、硬件连接1.用RJ45口普通网线将PLC和打标机连接。 三、软件通讯连接 1.打标机侧工控机-更改操作权限-点击菜单栏Setup,在下拉菜单中,点击Level,在下一级菜单点击Supervisor(左下…

俄语演讲开场白,柯桥外贸俄语培训

1、&#xff08;Разрешите мне&#xff09;от имени... 请允许我代表... 例&#xff1a; Разрешите мне от имени нашей компании поприветствовать всех членов вашей делегации…

文献解读-农业系列-第八期|《有害突变在多倍体棉花中积累速度快于二倍体棉花,且在亚基因组间不平衡》

关键词&#xff1a;基因组变异检测&#xff1b;全基因组测序&#xff1b;基因组多倍体化&#xff1b; 文献简介 标题&#xff08;英文&#xff09;&#xff1a;Deleterious Mutations Accumulate Faster in Allopolyploid Than Diploid Cotton (Gossypium) and Unequally betw…

AI办公自动化:用Kimi批量在Excel文件名中加入日期

工作任务&#xff1a;在一个文件夹中所有的Excel文件后面加上一个日期 在Kimi中输入提示词&#xff1a; 你是一个Python编程专家&#xff0c;写一个Python脚本&#xff0c;具体步骤如下&#xff1a; 打开文件夹&#xff1a;F:\AI自媒体内容\AI行业数据分析\投融资 读取里面所…

Cartographer学习笔记

Cartographer 是一个跨多个平台和传感器配置提供 2D 和 3D 实时同步定位和地图绘制 (SLAM) 的系统。 1. 文件关系 2. 代码框架 common: 定义了基本数据结构和一些工具的使用接口。例如&#xff0c;四舍五入取整的函数、时间转化相关的一些函数、数值计算的函数、互斥锁工具等…

[next.js]移动端调试vconsole

一般最简单的调试方式当然是使用vconsole来输出想要的数据啦&#xff1b; next.js如果想使用的话需要在客户端环境里调用才行&#xff08;服务端直接看cmd控制台就够了&#xff09;&#xff1b; 先安装vconsole npm i -D vconsolenext.js不像react cli或者vue一样有一个main.…

webshell后门自查--河马webshel工具介绍

什么是web后门 Java Web 是很多大型厂商的选择&#xff0c;也正是因为如此&#xff0c;Java Web 的安全问题日益得到重视&#xff0c;JSP Webshell 就是其中之一。最著名的莫过于 PHP 的各种奇思妙想的后门&#xff0c;但与 PHP 不同的是&#xff0c;Java 是强类型语言&#x…

autoware lidar-centerpoint 点云在rviz上叠加显示问题

在使用自采数据包放入autoware中的lidar_centerpoint上进行检测时发现&#xff0c;在rviz可视化上出现问题&#xff1a;多帧点云在一个位置上不断叠加&#xff0c;不能正常随时间显示。 如下图所示&#xff1a; 解决方法&#xff1a; 出现上述问题是因为autoware默认使用的是…

使用Vue3+ElementPlus+高德地图实现在浏览器中搜索地点并被标记在地图中

效果描述 在页面的输入框中输入想要查询的地点&#xff0c;在输入框的下方会提示跟输入的关键字有关地点&#xff0c;然后按下回车键或者选择下方罗列的地点即可让地图跳转到搜索的位置。 效果展示 页面渲染完成的时候 输入想要查询的地点 按下回车键之后 代码实现 <temp…

Python强化学习(Reinforcement Learning, RL)库之gymnasium使用详解

概要 在强化学习(Reinforcement Learning, RL)领域中,环境(Environment)是进行算法训练和测试的关键部分。gymnasium 库是一个广泛使用的工具库,提供了多种标准化的 RL 环境,供研究人员和开发者使用。通过 gymnasium,用户可以方便地创建、管理和使用各种 RL 环境,帮助…