10.3 Go 同步与通信

news2024/12/26 23:44:50

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

  • 推荐:「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.WaitGroup

for _, 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.coloradmin.cn/o/1812013.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

BUUCTF---web---[SUCTF 2019]CheckIn

1、点击题目连接来到页面 2、上传正常的jpg文件&#xff0c;提示内容不能有<?。本来打算上传图片马&#xff0c;但是有过滤 3、可以改成下面的图片马&#xff1a; <script languagephp>eval($_POST[cmd]);</script> 4、将上面的一句话木马先写成txt再修改后缀为…

idea插件开发之hello idea plugin

写在前面 最近一直想研究下自定义idea插件的内容&#xff0c;这样如果是想要什么插件&#xff0c;但又一时找不到合适的&#xff0c;就可以自己来搞啦&#xff01;这不终于有时间来研究下&#xff0c;但过程可谓是一波三折&#xff0c;再一次切身体验了下万事开头难。那么&…

opencv_GUI

图像入门 import numpy as np import cv2 as cv # 用灰度模式加载图像 img cv.imread(C:/Users/HP/Downloads/basketball.png, 0)# 即使图像路径错误&#xff0c;它也不会抛出任何错误&#xff0c;但是打印 img会给你Nonecv.imshow(image, img) cv.waitKey(5000) # 一个键盘绑…

快递一键查询,只需快递单号,轻松掌握全程物流信息,让您的包裹追踪无忧!

在快节奏的现代生活中&#xff0c;快递已经成为我们生活中不可或缺的一部分。无论是网购的宝贝、亲朋好友寄来的礼物&#xff0c;还是工作中的紧急文件&#xff0c;快递都承载着我们的期待和需要。然而&#xff0c;面对众多的快递公司和复杂的查询流程&#xff0c;如何快速、准…

新火种AI|摊上事儿了!13名OpenAI与谷歌员工联合发声:AI失控可能导致人类灭绝...

作者&#xff1a;小岩 编辑&#xff1a;彩云 2024年&#xff0c;OpenAI的CEO Sam Altman就没有清闲过&#xff0c;他似乎一直走在解决麻烦的路上。最近&#xff0c;他的麻烦又来了。 当地时间6月4日&#xff0c;13位来自OpenAI和Google Deep Mind的现任及前任员工联合发布了…

UFS Explorer Professional Recovery: 如何从启用了 mSATA 缓存的 Drobo 设备中恢复数据

天津鸿萌科贸发展有限公司是 UFS Explorer Professional Recovery 数据恢复软件的授权代理商。 UFS Explorer Professional Recovery 数据恢复软件提供综合性的解决方案&#xff0c;用于解决复杂的数据恢复案例&#xff0c;包括那些采用特殊存储技术的案例&#xff0c;或介质受…

“解锁用户留存与复购:链动2+1模式的创新应用与策略“

大家好&#xff0c;我是吴军&#xff0c;担任一家知名软件开发公司的产品经理。 今天&#xff0c;我想和大家分享的是关于如何通过链动21模式来提升用户留存和复购率的策略。 尽管链动模式已经存在一段时间&#xff0c;但许多人认为它已经过时了。实际上&#xff0c;链动模式具…

【Text2SQL 论文】CHESS:利用上下文来合成 SQL 的 pipeline

文章目录 一、论文速读二、CHESS pipeline2.1 Entity and Context Retrieval2.2 Schema Selection2.3 Query Generation 三、预处理四、实验五、总结讨论 一、论文速读 本文提出了一个 pipeline 框架——CHESS——来解决应用于复杂的真实数据库场景下的 Text2SQL 问题。 在现…

vue3的个人理解

本文目的是记录使用vue3的时候的一些属性的个人理解。 一、defineExpose 官方说明 个人理解 在 <script setup>组件中&#xff0c;defineExpose可以暴露出组件的属性。项目实战// dialog组件 <script setup>import { ref } from vueimport { Close } from elemen…

【OCPP】ocpp1.6协议第4.5章节Firmware Status Notification的介绍及翻译

目录 4.5、固件状态通知Firmware Status Notification-概述 Firmware Status Notification 消息 Firmware Status Notification 请求消息 Firmware Status Notification 响应消息 使用场景 举例 FirmwareStatusNotification 请求示例 处理 FirmwareStatusNotification …

RAG与知识库搭建

Tip: 如果你在进行深度学习、自动驾驶、模型推理、微调或AI绘画出图等任务&#xff0c;并且需要GPU资源&#xff0c;可以考虑使用UCloud云计算旗下的Compshare的GPU算力云平台。他们提供高性价比的4090 GPU&#xff0c;按时收费每卡2.6元&#xff0c;月卡只需要1.7元每小时&…

ClickHouse快速安装教程(MacOS)

文章目录 ClickHouse快速安装教程&#xff08;MacOS&#xff09;1.ClickHouse2.快速安装3.快速启动3.1.启动服务器3.2.启动客户端 4.使用案例1.配置文件2.启动CK服务3.创建数据库4.创建表5.插入数据6.查询数据 ClickHouse快速安装教程&#xff08;MacOS&#xff09; 1.ClickHo…

如何利用 Google 搜索结果页来引导?

在数据驱动的决策世界中&#xff0c;获取准确而全面的信息至关重要。Google 搜索结果抓取是一种强大的技术&#xff0c;可以让企业、调查人员和研究人员从搜索引擎结果中提取可靠的数据。本综合指南将深入研究 Google 搜索结果的最佳实践、工具和道德考量&#xff0c;以确定能够…

PB-03F 二次开发——GPIO中断

文章目录 前言一、函数介绍1. hal_gpioin_register2. hal_gpio_init3. hal_gpio_pin_init4. hal_gpio_fast_write5. hal_gpio_read6. hal_gpioin_enable7. hal_gpioin_disable二、工具1. 硬件2. 软件 三、GPIO demo示例1. main.c2. 项目框架3. 注意 四、 烧录总结 前言 本文简…

数据结构下的线性回归模型

文章目录 1. 线性回归模型的基本概念与原理2. 数据结构在构建线性回归模型中的应用2.1 数组和矩阵2.2 列表2.3 字典2.4 数据框架 3. 线性回归模型的实现方法4. 示例代码演示总结 线性回归是统计学中最基础也是应用最广泛的预测模型之一&#xff0c;主要用于分析两个或两个以上变…

八轴光电测径仪在传统四大行业的具体应用

关键字:八轴测径仪, 智能测径仪,工业测径仪, 非接触测径仪,蓝鹏测控 八轴光电测径仪在多个行业中都有广泛的应用&#xff0c;尤其是在需要高精度尺寸控制的领域。以下是一些具体的应用实例&#xff1a; 这些应用展示了八轴光电测径仪在不同行业中的多样性和重要性。通过提供高精…

落地台灯什么牌子的比较好?五款适合学生使用的大路灯分享

以往只知道养孩子难&#xff0c;但到底有多难&#xff0c;心里确实没有个切实的预期&#xff0c;但随着我家孩子越长越大&#xff0c;我才知道原来想要把孩子的身心健康照顾好到底是有多难&#xff01;吃、穿、住、行无一不要精心挑选&#xff0c;就是为了能给他营造一个更好的…

StarRocks vs. Trino: 高并发性能背后的技术优势是什么?

Trino&#xff08;之前称 PrestoSQL&#xff09;项目最初由 Meta 开发&#xff0c;旨在让数据分析师能够在广泛的 Apache Hadoop 数据仓库上执行交互式查询。其高效处理大型数据集和复杂查询的能力&#xff0c;以及多数据源连接的灵活性&#xff0c;使其迅速成为大规模组织的首…

【初阶数据结构】深入解析顺序表:探索底层逻辑

&#x1f525;引言 本篇将深入解析顺序表:探索底层逻辑&#xff0c;理解底层是如何实现并了解该接口实现的优缺点&#xff0c;以便于我们在编写程序灵活地使用该数据结构。 &#x1f308;个人主页&#xff1a;是店小二呀 &#x1f308;C语言笔记专栏&#xff1a;C语言笔记 &…

【必会面试题】布隆过滤器

目录 基本组成部分&#xff1a;工作原理&#xff1a;特点&#xff1a;一个简单的示例应用场景&#xff1a; 布隆过滤器&#xff08;Bloom Filter&#xff09;是一种空间效率极高且查询速度很快的概率型数据结构&#xff0c;用于测试一个元素是否属于一个集合。布隆过滤器的基本…