Go语言的并发与管道

Go语言以其简洁的语法和强大的并发处理能力而闻名。在Go中,goroutines是并发执行的基本单位,而channels则是goroutines之间通信的管道。本篇博客将详细介绍Go语言中的并发、管道(发送、接收)、无缓冲管道、有缓冲管道、关闭管道、单向管道以及多路复用的概念,并通过实例进行说明。

并发

并发是Go语言的核心特性之一,它允许我们同时执行多个任务。在Go中,goroutines是轻量级的线程,由Go运行时管理。goroutines之间的切换非常高效,因为它们共享同一个进程的内存空间。

示例

package mainimport ("fmt""time"
)func main() {go func() {fmt.Println("zhangsan")}()fmt.Println("我是main goroutine")time.Sleep(1 * time.Second)
}

在这个例子中,我们启动了一个goroutine,它会打印“zhangsan”,而主线程会打印“我是main goroutine”。由于goroutine的执行是并发的,所以两个打印语句的执行顺序是不确定的。

管道(Channels)

管道是Go中goroutines之间通信的机制。通过管道,goroutines可以发送和接收数据。

发送和接收

发送数据到管道使用 <- 操作符,接收数据使用 <- 操作符。

示例

package mainimport ("fmt"
)func main() {ch := make(chan string)go func() {fmt.Println("zhangsan")ch <- "goroutine 完成"}()fmt.Println("我是main goroutine")v := <-chfmt.Println("接收到chan中的值:", v)
}

在这个例子中,一个goroutine发送了一个字符串到管道,主线程从管道中接收并打印了这个字符串。

无缓冲管道

无缓冲管道必须在接收者准备好之前,发送者不能发送数据,否则会阻塞。

示例

package mainimport ("fmt"
)func main() {ch := make(chan string)go func() {ch <- "无缓冲管道"}()v := <-chfmt.Println("接收到无缓冲管道中的值:", v)
}

在这个例子中,goroutine发送数据到无缓冲管道,主线程接收数据。如果主线程没有准备好接收,goroutine将会阻塞。

有缓冲管道

有缓冲管道可以在没有接收者的情况下存储一定数量的数据。

示例

package mainimport ("fmt"
)func main() {cacheCh := make(chan int, 5)cacheCh <- 2cacheCh <- 3fmt.Println("cacheCh 容量为:", cap(cacheCh), "元素个数为:", len(cacheCh))go func() {fmt.Println(<-cacheCh)}()
}

在这个例子中,我们创建了一个容量为5的有缓冲管道。我们可以向管道中发送数据,而不会阻塞,直到管道满了为止。

关闭管道

关闭管道后,不能再向管道中发送数据,但可以接收数据。如果尝试向已关闭的管道发送数据,程序会panic。

示例

package mainimport ("fmt"
)func main() {cacheCh := make(chan int, 5)cacheCh <- 2cacheCh <- 3close(cacheCh)go func() {fmt.Println(<-cacheCh)}()
}

在这个例子中,我们关闭了管道,然后启动了一个goroutine来接收数据。关闭管道后,不能再向管道中发送数据。

单向管道

单向管道只能用于发送或接收,不能同时进行。

示例

package mainimport ("fmt"
)func main() {onlySend := make(chan<- int)onlyResive := make(<-chan int)onlySend <- 1<-onlyResive
}

在这个例子中,onlySend 是一个只发送的管道,onlyResive 是一个只接收的管道。尝试向只接收的管道发送数据或从只发送的管道接收数据都会导致编译错误。

多路复用

多路复用允许我们同时从多个管道中接收数据。

示例

package mainimport ("fmt"
)func downLoad(chanName string) string {time.Sleep(1 * time.Second)return chanName + ":filePath"
}func main() {firstCh := make(chan string)secondCh := make(chan string)threeCh := make(chan string)go func() {firstCh <- downLoad("first")}()go func() {secondCh <- downLoad("second")}()go func() {threeCh <- downLoad("three")}()select {case v := <-firstCh:fmt.Println("firstCh:", v)case v := <-secondCh:fmt.Println("secondCh:", v)case v := <-threeCh:fmt.Println("threeCh:", v)}
}

在这个例子中,我们启动了三个goroutine,每个goroutine下载一个文件并将其路径发送到不同的管道。主线程使用select语句从这三个管道中接收数据,实现了多路复用。

通过以上示例,我们可以看到Go语言在并发处理和管道通信方面的强大能力。这些特性使得Go语言非常适合用于构建高性能的并发应用程序。

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

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

相关文章

SpringCloud Gateway转发请求到同一个服务的不同端口

SpringCloud Gateway默认不支持将请求路由到一个服务的多个端口 本文将结合Gateway的处理流程&#xff0c;提供一些解决思路 需求背景 公司有一个IM项目&#xff0c;对外暴露了两个端口8081和8082&#xff0c;8081是springboot启动使用的端口&#xff0c;对外提供一些http接口…

Parker派克防爆电机在实际应用中的安全性能如何保证?

Parker防爆电机确保在实际应用中的安全性能主要通过以下几个方面来保证&#xff1a; 1.防爆外壳设计&#xff1a;EX系列电机采用强大的防爆外壳&#xff0c;设计遵循严格的防爆标准&#xff0c;能够承受内部可能发生的爆炸而不破损&#xff0c;利用间隙切断原理&#xff0c;防…

虚拟形象+动作捕捉:解锁品牌N种营销玩法

近年来&#xff0c;随着Z世代年轻人对于二次元文化的热爱&#xff0c;各种二次元内容频频出圈。为了吸引年轻观众的注意&#xff0c;虚拟IP形象成为了品牌营销的“新宠”与“利器”为品牌踏入元宇宙蓝海提供了关键的切入点。在此背景下虚拟形象动作捕捉技术的组合应用方式正成为…

空间计算、物理计算、实时仿真与创造拥有「自主行为」的小狗 | 播客《编码人声》

「编码人声」是由「RTE开发者社区」策划的一档播客节目&#xff0c;关注行业发展变革、开发者职涯发展、技术突破以及创业创新&#xff0c;由开发者来分享开发者眼中的工作与生活。 虚拟世界与现实世界的界限逐渐模糊&#xff0c;已然成为不争的事实。但究竟哪些曾经的幻想已然…

影响电阻可靠性的因素

一、影响电阻可靠性的因素&#xff1a; 影响电阻可靠性的因素有温度系数、额定功率&#xff0c;最大工作电压、固有噪声和电压系数 &#xff08;一&#xff09;温度系数 电阻的温度系数表示当温度改变1摄氏度时&#xff0c;电阻阻值的相对变化&#xff0c;单位为ppm/C.电阻温度…

JAVA后端如何调用百度的身份证识别API

大家好&#xff0c;我是 程序员码递夫 。 今天给大家分享的是 JAVA后台如何调用百度的身份证识别API。 1、前言 我们做APP开发时常遇到 身份证认证或资质认证的 需求&#xff0c; 通过上传身份证照片是个常用的操作&#xff0c; 后台对上传的身份证照信息进行识别&#xff0…

Go语言进阶依赖管理

1. Go语言进阶 1.1 Goroutine package mainimport ("fmt""time" )func hello(i int) {println("hello goroutine : " fmt.Sprint(i)) }func main() {for i : 0; i < 5; i {go func(j int) { hello(j) }(i) // 启动一个新的 goroutine&…

基于Java Springboot高考志愿填报辅助系统

一、作品包含 源码数据库全套环境和工具资源部署教程 二、项目技术 前端技术&#xff1a;Html、Css、Js、Vue、Element-ui 数据库&#xff1a;MySQL 后端技术&#xff1a;Java、Spring Boot、MyBatis 三、运行环境 开发工具&#xff1a;IDEA/eclipse 数据库&#xff1a;…

autoware(2)运行自己的数据集

上一节完成了autoware.ai的安装和编译跑通了demo数据集&#xff0c;本将自己录制的数据包用于测试 1.修改点云地图 将加载点云地图的my_map.launch文件复制并命名为my_map_test.launch&#xff0c; &#xff08;1&#xff09;point cloud处替代原来的点云地图为自己的&#…

el-select 和el-tree二次封装

前言 本文章是本人在开发过程中&#xff0c;遇到使用树形数据&#xff0c;动态单选或多选的需求&#xff0c;element中没有这种组件&#xff0c;故自己封装一个&#xff0c;欢迎多多指教 开发环境&#xff1a;element-UI、vue2 组件效果 单选 多选 组件引用 <treeselec…

【LeetCode热题100】栈

这道题一共记录了关于栈的5道题目&#xff1a;删除字符串中所有相邻重复项、比较含退格的字符串、基本计算器II、字符串解码、验证栈序列。 class Solution { public:string removeDuplicates(string s) {string ret;for(auto c : s){if(ret.size() 0 || c ! ret.back()) ret …

《Python基础》之pip换国内镜像源

目录 推荐镜像源网址&#xff1a; 方法一&#xff1a;手动换源 方法二&#xff1a;命令提示符指令换源 临时换源 推荐镜像源网址&#xff1a; 阿里云&#xff1a;Simple Indexhttp://mirrors.aliyun.com/pypi/simple/ 华为云&#xff1a;Index of python-local https://m…

全面击破工程级复杂缓存难题

目录 一、走进业务中的缓存 &#xff08;一&#xff09;本地缓存 &#xff08;二&#xff09;分布式缓存 二、缓存更新模式分析 &#xff08;一&#xff09;Cache Aside Pattern&#xff08;旁路缓存模式&#xff09; 读操作流程 写操作流程 流程问题思考 问题1&#…

Kafka 分区分配及再平衡策略深度解析与消费者事务和数据积压的简单介绍

Kafka&#xff1a;分布式消息系统的核心原理与安装部署-CSDN博客 自定义 Kafka 脚本 kf-use.sh 的解析与功能与应用示例-CSDN博客 Kafka 生产者全面解析&#xff1a;从基础原理到高级实践-CSDN博客 Kafka 生产者优化与数据处理经验-CSDN博客 Kafka 工作流程解析&#xff1a…

[Unity Demo]从零开始制作空洞骑士Hollow Knight第二十集:制作专门渲染HUD的相机HUD Camera和画布HUD Canvas

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、制作HUD Camera以及让两个相机同时渲染屏幕二、制作HUD Canvas 1.制作法力条Soul Orb引入库2.制作生命条Health读入数据3.制作吉欧统计数Geo Counter4.制作…

30. 并发编程

一、什么是多任务 如果一个操作系统上同时运行了多个程序&#xff0c;那么称这个操作系统就是 多任务的操作系统&#xff0c;例如&#xff1a;Windows、Mac、Android、IOS、Harmony 等。如果是一个程序&#xff0c;它可以同时执行多个事情&#xff0c;那么就称为 多任务的程序。…

ElasticSearch学习篇17_《检索技术核心20讲》最邻近检索-局部敏感哈希、乘积量化PQ思路

目录 场景在搜索引擎和推荐引擎中&#xff0c;对相似文章去重是一个非常重要的环节&#xff0c;另外是拍照识花、摇一摇搜歌等场景都可以使用它快速检索。 基于敏感性哈希的检索更擅长处理字面上的相似而不是语义上的相似。 向量空间模型ANN检索加速思路 局部敏感哈希编码 随…

mongodb多表查询,五个表查询

需求是这样的&#xff0c;而数据是从mysql导入进来的&#xff0c;由于mysql不支持数组类型的数据&#xff0c;所以有很多关联表。药剂里找药物&#xff0c;需要药剂与药物的关联表&#xff0c;然后再找药物表。从药物表里再找药物与成分关联表&#xff0c;最后再找成分表。 这里…

《机器人控制器设计与编程》考试试卷**********大学2024~2025学年第(1)学期

消除误解&#xff0c;课程资料逐步公开。 复习资料&#xff1a; Arduino-ESP32机器人控制器设计练习题汇总_arduino编程语言 题-CSDN博客 试卷样卷&#xff1a; 开卷考试&#xff0c;时间&#xff1a; 2024年11月16日 001 002 003 004 005 ……………………装………………………

DataWorks快速入门

DataWorks基于MaxCompute、Hologres、EMR、AnalyticDB、CDP等大数据引擎&#xff0c;为数据仓库、数据湖、湖仓一体等解决方案提供统一的全链路大数据开发治理平台。本文以DataWorks的部分核心功能为例&#xff0c;指导您使用DataWorks接入数据并进行业务处理、周期调度以及数据…