Golang 协程和 Channel 的协同工作

在 Golang 中,协程(goroutine)和通道(channel)是并发编程的两大支柱。协程是一种轻量级的线程,而通道则是协程之间进行通信的管道。在本文中,我们将通过一个简单的示例来深入理解它们是如何协同工作的。

协程:Golang 并发的核心

Golang 的协程是一种非常高效的并发机制。与传统的线程相比,协程的创建和切换开销要小得多。在 Golang 中,协程是默认非阻塞的,这意味着当一个协程在等待另一个协程完成操作时,它不会占用 CPU 资源。

通道:协程间的通信桥梁

通道是 Golang 中用于在协程之间传递数据的一种类型。通道可以是有缓冲的,也可以是无缓冲的。无缓冲的通道在读写时都是阻塞的,这保证了数据的同步传递。当通道被关闭后,任何试图从该通道读取数据的操作都会立即返回,并且返回的值是通道元素类型的零值。

示例:生成并打印随机数

下面是一个使用协程和通道的示例代码,它演示了如何生成五个随机数,并将它们打印到标准输出。

package mainimport ("fmt""math/rand""sync""time"
)func main() {// 创建一个无缓冲的 channelout := make(chan int)// 创建一个 WaitGroup 用于等待两个协程完成var wg sync.WaitGroupwg.Add(2)// 第一个协程:生成随机数并发送到 channelgo func() {defer wg.Done()for i := 0; i < 5; i++ {// 生成随机数并发送到 channelout <- rand.Intn(100) // 这里我们生成 0 到 99 之间的随机数}// 发送完所有随机数后,关闭 channelclose(out)}()// 第二个协程:从 channel 中读取并打印随机数go func() {defer wg.Done()for num := range out {fmt.Println(num)}}()// 等待两个协程完成wg.Wait()
}

代码解析

  1. 创建通道:我们首先创建了一个无缓冲的整数类型通道 out

  2. 初始化 WaitGroupsync.WaitGroup 用于等待多个协程完成。我们添加了两个协程,所以调用了 wg.Add(2)

  3. 第一个协程:这个协程负责生成随机数。我们使用 rand.Intn(100) 生成 0 到 99 之间的随机整数,并将其发送到 out 通道。生成了五个随机数后,我们关闭了通道。

  4. 第二个协程:这个协程负责从 out 通道读取数据,并将其打印到标准输出。由于通道是无缓冲的,这个协程会阻塞,直到有数据可读。当通道关闭后,for 循环会退出。

  5. 等待协程完成:最后,我们调用 wg.Wait() 等待两个协程都完成执行。

总结

通过这个简单的示例,我们可以看到 Golang 协程和通道如何协同工作来实现并发操作。这种模式非常适合处理 I/O 密集型任务,如网络通信、文件读写等。理解并掌握协程和通道的使用,将帮助你编写出高效、简洁且易于维护的并发程序。

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

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

相关文章

GPT-4o:突破与革新

近年来&#xff0c;人工智能&#xff08;AI&#xff09;技术迅速发展&#xff0c;特别是在自然语言处理&#xff08;NLP&#xff09;领域&#xff0c;GPT系列模型表现尤为突出。随着OpenAI不断推出新版本&#xff0c;GPT-4o作为最新成员&#xff0c;再次引起广泛关注。本文将对…

不同linux账户切换不同的cuda版本

原因 由于服务器中安装了两个版本的cuda&#xff08;cuda10.1和cuda11.1&#xff09;&#xff0c;不同项目可能需要应用不同的cuda版本&#xff0c;但是自己又没有root权限或者只想在使用指定conda环境时改为用指定的cuda版本。总结起来有三种方法&#xff1a; 1、修改软链接指…

新游启航 失落的方舟台服注册指南 一文教会你方舟台服注册

新游启航&#xff01;失落的方舟台服注册指南&#xff01;一文教会你方舟台服注册 失落的方舟作为本月最受期待游戏之一&#xff0c;在上线之际许多玩家已经有点急不可待了。这款游戏是由开发商Smile gate开发的一款MMORPG类型游戏&#xff0c;这款游戏的基本玩法与其他MMORPG…

理解AdaBoost算法:简单流程概述(一)【流程理解、无数学推导】

什么是AdaBoost 算法&#xff1f; AdaBoost&#xff08;Adaptive Boosting&#xff09;算法&#xff0c;全称为 自适应提升 &#xff0c;是 一种在机器学习中用作集成方法的提升技术 。它之所以被称为自适应提升&#xff0c;因为每个实例的权重会重新分配&#xff0c;错误分类…

前端面试题日常练-day47 【面试题】

题目 希望这些选择题能够帮助您进行前端面试的准备&#xff0c;答案在文末 1. 在Bootstrap中&#xff0c;以下哪个类用于创建一个具有响应式的栅格系统&#xff1f; a) .grid-system b) .responsive-grid c) .container-fluid d) .grid-responsive 2. 哪个Bootstrap类用于创…

Python 关于编码与解码

在Python中&#xff0c;字符串的编码和解码是处理字符串与字节之间转换的重要操作。 常见的字符串编码方式包括以下几种&#xff1a; ASCII 编码&#xff08;American Standard Code for Information Interchange&#xff09;&#xff1a;ASCII 是最早的字符编码标准&#xf…

推荐一个远程数据库 Supabase

地址&#xff1a;Supabase | The Open Source Firebase Alternative 使用文档&#xff1a; Supabase Docs

IO进程线程(三)文件IO之open/close read/write lseek

一、文件IO &#xff08;一&#xff09;概念 文件IO就是系统调用&#xff0c;用户空间进入内核空间的过程就是系统调用。 系统调用没有缓冲机制&#xff0c;效率较低&#xff0c;可移植性也相对较差&#xff0c;实时性高。 文件描述符是使用open函数打开文件时的返回值&…

NIUSHOP开源商城单商户V6版本:前端技术架构的深度解析

摘要&#xff1a; 本文将对NIUSHOP开源商城单商户V6版本的前端技术架构进行深度解析。NIUSHOP V6版本以其强大的多应用多插件组合设计理念、前后端完全分离的技术架构&#xff0c;以及支持多语言、多平台等特点&#xff0c;受到了市场的广泛好评。本文将详细介绍其前端技术栈的…

HOW - BFF 服务实践系列(一)

目录 一、BFF 介绍1.1 BFF 的概念1.2 为什么需要 BFF1.3 举例说明 二、适用于Web前端的BFF应该提供哪些能力2.1 接口聚合&#xff08;重要&#xff09;2.2 简化和优化的API2.3 安全和身份验证&#xff08;重要&#xff09;2.4 缓存机制2.5 错误处理和重试机制2.6 数据格式转换2…

【算法】贪心算法简介

贪心算法概述 目录 1.贪心算法概念2.贪心算法特点3.贪心算法学习 1.贪心算法概念 贪心算法是一种 “思想” &#xff0c;即解决问题时从 “局部最优” 从而达到 “全局最优” 的效果。 ①把解决问题的过程分为若干步②解决每一步时候&#xff0c;都选择当前最优解(不关注全局…

RDD实战:排序算子 - sortBy()

在本实战案例中&#xff0c;我们将使用Apache Spark的sortBy()算子来对一个包含学生信息的RDD进行排序操作。 排序规则如下&#xff1a; 首先按照性别升序排列。在性别相同的情况下&#xff0c;按照年龄降序排列。 步骤1&#xff1a;创建学生信息列表 首先&#xff0c;我们创…

基于51单片机和NRF24L01的无线温度监控设计

一、设计功能 由单片机、温度传感器、无线模块NRF24L01以及液晶显示器等构成高精度远 程无线温度监测系统。 温度显示精确到小数点后一位。 按键设定过温值&#xff0c;过温在液晶屏提示。 系统设计 三、器件选择3.1温度信号采集模块 传统的温度检测大多以热敏电阻为传感器&a…

【C++】list的使用(上)

&#x1f525;个人主页&#xff1a; Forcible Bug Maker &#x1f525;专栏&#xff1a; STL || C 目录 前言&#x1f308;关于list&#x1f525;默认成员函数构造函数&#xff08;constructor&#xff09;析构函数&#xff08;destructor&#xff09;赋值运算符重载 &#x1…

从技术底层超主层依次介绍大模型

目录 # 如何让大模型更聪明&#xff1f; 一、GPT大模型基本概念 二、大模型生态介绍 三、简单描述如何让大模型变得更加聪明 # 如何让大模型更聪明&#xff1f; 一、GPT大模型基本概念 前景&#xff1a; 40年一遇的技术变革&#xff1b;被优化的人口&#xff0c;在未来十…

五分钟“手撕”栈

实现代码放开头&#xff0c;供大家学习与查阅 目录 一、实现代码 二、什么是栈 三、栈的常见操作 底层实现是链表。 入栈 出栈 四、Stack的使用 五、栈的习题 第一题 第二题 第三题 第四题 第五题 第六题 第七题 六、栈、虚拟机栈、栈帧的区别 目录 一、…

Request

一、Request介绍 在计算机网络中&#xff0c;"Request"&#xff08;请求&#xff09;通常指的是客户端向服务器发送的请求消息&#xff0c;用于获取特定资源或执行特定操作。在Web开发中&#xff0c;"Request"通常指的是HTTP请求&#xff0c;用于客户端与服…

速盾:香港服务器可以用cdn吗?

香港是一个互联网发达的地区&#xff0c;拥有优质的网络基础设施和大量的服务器机房。对于网站和应用开发者来说&#xff0c;选择一个合适的服务器位置是十分重要的。CDN&#xff08;内容分发网络&#xff09;是一种能够通过分布在全球各地的服务器节点来加速访问速度的技术&am…

信号稳定,性能卓越!德思特礁鲨系列MiMo天线正式发布!

作者介绍 礁鲨系列天线&#xff0c;以其独特的外观设计和强大的性能&#xff0c;成为德思特Panorama智能天线家族的最新成员。这款天线不仅稳定提供5G、WIFI和GNSS信号&#xff0c;更能在各类复杂环境中展现出卓越的性能。它的设计灵感来源于海洋中的礁鲨&#xff0c;象征着力量…

内存管理【C++】

内存分布 C中的内存区域主要有以下5种 栈&#xff08;堆栈&#xff09;&#xff1a;存放非静态局部变量/函数参数/函数返回值等等&#xff0c;栈是向下增长的【地址越高越先被使用】。栈区内存的开辟和销毁由系统自动执行 堆&#xff1a;用于程序运行时动态内存分配&#xff…