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.mzph.cn/bicheng/26075.shtml

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

相关文章

Android Studio Jellyfish版本修改project使用特定jdk版本的步骤

android studio总是把这些东西改来改去让人十分恼火&#xff0c;IDE本身改来改去就让人无法上手就立即工作&#xff0c;很多时间浪费在IDE和gradle的配置和奇奇怪怪现象的斗智斗勇上&#xff0c;搞Android是真的有点浪费生命。一入此坑深不见底 jellyfish版安卓studio已经无法通…

算法 | 剪枝函数以及几种形式回溯法和分支限界法的区别算法特性分支限界法的思想分支限界法的基本步骤Prim和Kruscal回溯法的效率

what is 剪枝函数&#xff1f; 是对该问题能否得到最优解或者可行解的约束 限界函数&#xff1a;最优解 约束函数&#xff1a;可行解 回溯法和分支限界法的区别&#xff1a; 异&#xff1a; 回溯法分支限界法一次生成/扩展一个结点一次生成所有的孩子结点BFSDFS/最小耗费优…

Docker高级篇之轻量化可视化工具Portainer

文章目录 1. 简介2. Portainer安装 1. 简介 Portianer是一款轻量级的应用&#xff0c;它提供了图形化界面&#xff0c;用于方便管理Docker环境&#xff0c;包括单机环境和集成环境。 2. Portainer安装 官网&#xff1a;https://www.portainer.io 这里我们使用docker命令安装&…

深入探讨API接口:定义、作用、设计原则及常见问题

API&#xff08;Application Programming Interface&#xff09;即应用程序编程接口&#xff0c;是软件系统间相互通信的桥梁&#xff0c;提供了一系列的约定和工具&#xff0c;使不同软件系统之间能够实现数据交换和功能调用。在软件开发中&#xff0c;API接口扮演着至关重要的…

渗透测试之内核安全系列课程:Rootkit技术初探(一)

今天&#xff0c;我们来讲一下内核安全&#xff01; 本文章仅提供学习&#xff0c;切勿将其用于不法手段&#xff01; 目前&#xff0c;在渗透测试领域&#xff0c;主要分为了两个发展方向&#xff0c;分别为Web攻防领域和PWN&#xff08;二进制安全&#xff09;攻防领域。在…

状态管理Vuex

官网&#xff1a;Vuex 是什么&#xff1f; | Vuex (vuejs.org)https://v3.vuex.vuejs.org/zh/ 创建一个vue2的新项目名为vuex-demo&#xff0c;安装命令 npm install vuex3 新建index.js import Vue from vue import Vuex from vuexVue.use(Vuex)const store new Vuex.Store(…

私域怎么引流?

在数字化营销日益重要的今天&#xff0c;私域流量成为了企业竞争的新焦点。私域流量指的是企业在自己的平台上所拥有和控制的用户资源&#xff0c;如企业官网、社交媒体账号、APP等。如何有效地进行私域引流&#xff0c;即将潜在用户引导至企业的私域平台&#xff0c;成为企业营…

java编码转换怎样实现将GB2312编码的字符串转换为ISO-8859-1编码的字符串

在Java中&#xff0c;直接进行GB2312到ISO-8859-1的编码转换可能会导致数据丢失&#xff0c;因为ISO-8859-1&#xff08;也称为Latin-1&#xff09;是一个单字节编码&#xff0c;它不支持像GB2312这样的多字节编码中的所有字符。GB2312主要用于简体中文&#xff0c;而ISO-8859-…

记录自己在xss-labs的通关记录

第十一关&#xff08;referer&#xff09; 直接查看网页源代码&#xff0c;发现四个input被隐藏&#xff0c;不难看出&#xff0c;第四个名为t_ref的<input>标签是http头referer的参数&#xff08;就是由啥地址转跳到这里的&#xff0c;http头的referer会记录有&#xf…

ES6中如何使用class和extends关键字实现继承?

在ES6中&#xff0c;可以使用class关键字来定义类&#xff0c;使用extends关键字来实现继承。下面是一个示例&#xff1a; // 父类 class Parent {constructor(name) {this.name name;}sayHello() {console.log(Hello, my name is ${this.name});} }// 子类 class Child ex…

操作系统安全:Windows系统安全配置,Windows安全基线检查加固

「作者简介」&#xff1a;2022年北京冬奥会网络安全中国代表队&#xff0c;CSDN Top100&#xff0c;就职奇安信多年&#xff0c;以实战工作为基础对安全知识体系进行总结与归纳&#xff0c;著作适用于快速入门的 《网络安全自学教程》&#xff0c;内容涵盖系统安全、信息收集等…

如何用R语言ggplot2画折线图

文章目录 前言一、数据集二、ggplot2画图1、全部代码2、细节拆分1&#xff09;导包2&#xff09;创建图形对象3&#xff09;主题设置4&#xff09;轴设置5&#xff09;图例设置6&#xff09;颜色7&#xff09;保存图片 前言 一、数据集 数据下载链接见文章顶部 数据&#xff1a…

STM32 Customer BootLoader 刷新项目 (一) STM32CubeMX UART串口通信工程搭建

STM32 Customer BootLoader 刷新项目 (一) STM32CubeMX UART串口通信工程搭建 文章目录 STM32 Customer BootLoader 刷新项目 (一) STM32CubeMX UART串口通信工程搭建功能与作用典型工作流程 1. 硬件原理图介绍2. STM32 CubeMX工程搭建2.1 创建工程2.2 系统配置2.3 USART串口配…

tokenization(一)概述

文章目录 背景基于词&#xff08;Word-based&#xff09;基于字符&#xff08;Character-based&#xff09;子词词元化&#xff08;Subword tokenization&#xff09; 背景 tokenization是包括大语言模型在内所有自然语言处理的任务的基础步骤&#xff0c;其目标是将文本数据转…

【面试干货】聚集索引和非聚集索引区别?

【面试干货】聚集索引和非聚集索引区别? 1、聚集索引&#xff08;Clustered Index&#xff09;1.1 特点1.2 例子 2、非聚集索引&#xff08;Nonclustered Index&#xff09;2.1 特点2.2 例子 3、根本区别 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&…

Sklearn的安装和用法

安装sklearn相对简单&#xff0c;因为它是一个Python库&#xff0c;可以通过Python的包管理器pip来安装。 Windows、macOS和Linux通用步骤&#xff1a; 确保Python已安装&#xff1a; sklearn是基于Python的&#xff0c;所以首先确保你的计算机上安装了Python。推荐使用Pytho…

NLP——电影评论情感分析

python-tensorflow2.0 numpy 1.19.1 tensorflow 2.0.0 导入库 数据加载 数据处理 构建模型 训练 评估 预测 1.基于2层dropout神经网络 2.基于LSTM的网络 #导入需要用到的库 import os import tarfile import urllib. request import tensorflow as tf import numpy a…

5W-35W-150W-300W-500W铝壳功率电阻器

带铝制外壳的电阻器 EAK采用铝型材的导线电阻器将久经考验的导线材料的高脉冲稳定性与优化的导热和高度保护相结合。安装在导热表面上可进一步改善散热并提高稳定性。 连接线有各种长度和材料可供选择。可选配集成温度开关。也可根据客户要求提供定制组件。 该产品有多种版本…

【代码随想录训练营】【Day 46】【动态规划-6】| Leetcode 518, 377

【代码随想录训练营】【Day 46】【动态规划-6】| Leetcode 518, 377 需强化知识点 完全背包基础&#xff08;遍历重量时 正序&#xff0c;保证物品可重复加入&#xff09;完全背包&#xff1a;组合问题&#xff0c;先物品后重量&#xff0c;排列问题&#xff0c;先重量后物品…

CVE-2023-37474(目录遍历)

靶场简介 Copyparty是一个可移植的文件服务器。在1.8.2版本之前的版本存在一个CTF技巧&#xff0c;该漏洞位于.cpr子文件夹中。路径遍历攻击技术允许攻击者访问位于Web文档根目录之外的文件、目录. 靶场 进入靶场 根据简介访问.cpr目录 使用curl命令访问etc/passwd文件 确定…