go语言进阶之并发模式
并发模式
并发模式是指在程序设计中同时处理多个任务或进程的方式,以提高效率和响应性
for select循环模式
for select循环模式通常用于处理并发操作,尤其是在需要等待多个通道时。
select的执行过程主要是以下几步
- 阻塞等待,直到其中一个通道可用
- 执行case,当一个通道准备好了,select将会执行对应的case
- 随机选择,如果多个通道可用,go会随机选择一个case执行
- 循环执行,在for循环中,select可以持续运行,监听多个通道
比如:
package main import ( "fmt" "time") func main() { ch1 := make(chan string) ch2 := make(chan string) go func() { time.Sleep(1 * time.Second) ch1 <- "来自ch1的消息" }() go func() { time.Sleep(1 * time.Second) ch2 <- "来自ch2的消息" }() for { select { case msg1 := <-ch1: fmt.Println("接收到", msg1) case msg2 := <-ch2: fmt.Println("接收到", msg2) case <-time.After(3 * time.Second): fmt.Println("超时") return } }
}
可以看到所有通道都可以输出。
select timeout模式
在go语言中使用数据库和网络请求时,一般都会设置查询超时,从而防止操作长时间挂起
package main import ( "context" "database/sql" "fmt" "log" "time" _ "github.com/lib/pq" // PostgreSQL driver
) func main() { // 连接到数据库 db, err := sql.Open("postgres", "user=username dbname=mydb sslmode=disable") if err != nil { log.Fatal(err) } defer db.Close() // 设置查询超时为5秒 ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) defer cancel() // 确保在操作完成后调用cancel // 执行查询 var result string err = db.QueryRowContext(ctx, "SELECT name FROM users WHERE id = \$1", 1).Scan(&result) if err != nil { if err == context.DeadlineExceeded { fmt.Println("查询超时") } else { log.Fatal(err) } } else { fmt.Println("查询结果:", result) }
}
Pipeline模式(流水线模式)
流水线模式模拟的就是现实的流水线生产。主要就是通过一道道工序组装而成,每一道工序只负责自己的事情,这种模式就是流水线模式。
package mainimport ("fmt""sync"
)// 生产者,生成数据
func producer(out chan<- int, wg *sync.WaitGroup) {defer wg.Done()for i := 0; i < 10; i++ {out <- i}close(out)
}// 处理阶段,处理数据
func worker(in <-chan int, out chan<- int, wg *sync.WaitGroup) {defer wg.Done()for n := range in {out <- n * 2 // 示例处理:将数字乘以 2}close(out)
}// 消费者,接收处理后的数据
func consumer(in <-chan int, wg *sync.WaitGroup) {defer wg.Done()for n := range in {fmt.Println(n) // 输出处理后的结果}
}func main() {var wg sync.WaitGroup// 创建用于连接各个阶段的 channelpipeline1 := make(chan int)pipeline2 := make(chan int)wg.Add(1)go producer(pipeline1, &wg)wg.Add(1)go worker(pipeline1, pipeline2, &wg)wg.Add(1)go consumer(pipeline2, &wg)// 等待所有 goroutine 完成wg.Wait()
}
这一段代码主要通过流水线模式来实现了0到9的数据乘2并打印,其中每个函数都是独立完成一个步骤并拼接起来的。
可以通过代码发现流水线模式的特点
- 在使用流水线模式时,每道工序都通过channel将数据传递到下一个工序
- 每一个工序一般都会对应一个函数
- 最终要有个main函数类似函数将这些工序串起来,这样就可以形成完整的数据流
扇出和扇入模式
扇入模式和扇出模式是由于流水线模式的运行速度不佳而进行改造的模式。
其中原理为增加流水线某个速度低下的步骤,让其同时运行多个步骤,再汇总到下一步骤中。
扇出(Fan-out)
扇出是指将一个输入流的数据分发到多个处理单元(goroutines)。这种模式可以用来提高处理能力,允许多个并发执行的 goroutine 同时处理数据。
package mainimport ("fmt""sync"
)// 处理函数
func worker(id int, jobs <-chan int, wg *sync.WaitGroup) {defer wg.Done()for job := range jobs {fmt.Printf("Worker %d processing job %d\n", id, job)}
}func main() {const numWorkers = 3jobs := make(chan int, 10)var wg sync.WaitGroup// 启动多个 workerfor i := 1; i <= numWorkers; i++ {wg.Add(1)go worker(i, jobs, &wg)}// 发送任务for j := 1; j <= 10; j++ {jobs <- j}close(jobs) // 关闭 jobs channel 以结束 workerwg.Wait() // 等待所有 worker 完成
}
扇入(Fan-in)
扇入是指将多个输入流的数据汇聚到一个处理单元。它可以用来合并多个 goroutine 的结果到一个 channel,通常在需要整合多个处理结果时使用。
package mainimport ("fmt""sync"
)// 生成任务的函数
func generate(id int, jobs chan<- int, wg *sync.WaitGroup) {defer wg.Done()for j := 0; j < 3; j++ {jobs <- j + id*3 // 生成不同的任务}
}// 执行任务的函数
func worker(jobs <-chan int, wg *sync.WaitGroup) {defer wg.Done()for job := range jobs {fmt.Printf("Processing job %d\n", job)}
}func main() {const numGenerators = 3jobs := make(chan int, 10)var wg sync.WaitGroup// 启动生成器for i := 0; i < numGenerators; i++ {wg.Add(1)go generate(i, jobs, &wg)}// 启动一个 worker 处理所有任务wg.Add(1)go worker(jobs, &wg)// 等待所有生成器完成wg.Wait()close(jobs) // 关闭 jobs channel// 等待 worker 完成wg.Wait()
}
Future模式
Future模式是一个处理异步操作的编程模式,它与pipeline模式中工序必须要一个个运行不太一样,
Future模式允许在执行耗时操作是,不必等待操作完成,可以同时进行多个步骤,从而提高程序的效率和响应性。
其基本概念有:
- 异步执行:通过goroutines来异步执行任务
- 结果封装:使用通道来传递任务的结果
- 错误处理:同时处理异步操作可能出现的错误
总的来说,这个模式就是可以同时操作多个不同步骤,当所有操作结束时再进行返回。
package main import ( "fmt" "time") type Future struct { result interface{} err error
} func AsyncTask() Future { ch := make(chan Future) go func() { time.Sleep(2 * time.Second) ch <- Future{result: "Task completed", err: nil} }() return <-ch
} func main() { future := AsyncTask() if future.err != nil { fmt.Println("Error:", future.err) } else { fmt.Println(future.result) }
}
其最大的特点就是返回结果,所以在未来获取这个结果的操作必须是一个阻塞的操作,要一直等待获取结果为止。
相关文章:
go语言进阶之并发模式
并发模式 并发模式是指在程序设计中同时处理多个任务或进程的方式,以提高效率和响应性 for select循环模式 for select循环模式通常用于处理并发操作,尤其是在需要等待多个通道时。 select的执行过程主要是以下几步 阻塞等待,直到其中一…...
Spring Cloud LoadBalancer:负载均衡的服务调用
在微服务系统中,有时候一个服务会部署多个实例,在我们调用这类实例时,如何实现负载均衡的调用呢?这时候就要用到Spring Cloud的负载均衡组件LoadBalancer了 LoadBalancer简介 LoadBalancer是Spring Cloud官方提供的负载均衡组件,通过它能使客户端在多个服务实例之间分发传…...
微信小程序之轮播图
效果图 实现 <swiper class"banner" indicator-dots"true" indicator-color"rgba(255,255,255,1)" indicator-active-color"#ff0000" autoplay"true" interval"100" circular"true"><swi…...
羲和数据集收集器1.3
为了实现所要求的功能,我们需要进一步完善代码,使其能够处理多种格式的输入文件,并生成符合要求的 JSON 格式的输出文件。具体来说,我们完善了以下内容: 增强 extract_qa_pairs_from_content 函数:使其能够识别和处理不同格式的 QA 对。 确保输出文件的格式正确:每个 Q…...
UE--IOS打包失败 AutomationTool exiting with ExitCode=9 (9)
[Remote] Executing build UATHelper: 打包 (IOS): Setting up bundled DotNet SDK UATHelper: 打包 (IOS): /Users/zyh/UE5/Builds/DESKTOP-FKKSVFQ/Y/UE/UE_5.2/Engine/Build/BatchFiles/Mac/../../../Binaries/ThirdParty/DotNet/6.0.302/mac-x64 UATHelper: 打包 (IOS)…...
第8章利用CSS制作导航菜单
8.1 水平顶部导航栏 水平菜单导航栏是应用范围最广的网站导航设计,一般位于页面顶部。它适用性强,几乎适用于所有类型的网站,且设计难度低。若导航过于普通,无法承载复杂信息结构,在内容模块较多时,则需结…...
UNIX网络编程-TCP套接字编程
概述 TCP客户端/服务器程序示例是执行如下步骤的一个回射服务器: 客户端从标准输入读入一行文本,并写给服务器。服务器从网络输入读入这行文本,并回射给客户端。客户端从网络输入读入这行回射文本,并显示在标准输出上。 TCP服务器…...
美团代付微信小程序 read.php 任意文件读取漏洞复现
0x01 产品描述: 美团代付微信小程序是美团点评旗下的一款基于微信小程序技术开发的应用程序功能,它允许用户方便快捷地请求他人为自己支付订单费用。通过微信小程序,用户可以轻松实现代付操作,无需跳转到其他应用或网页…...
centos7 node升级到node18
使用jenkins发布vue3项目提示node18安装失败 错误日志: /var/lib/jenkins/tools/jenkins.plugins.nodejs.tools.NodeJSInstallation/Node18/bin/node: /lib64/libm.so.6: version GLIBC_2.27 not found (required by /var/lib/jenkins/tools/jenkins.plugins.node…...
使用Matlab建立随机森林
综述 除了神经网络模型以外,树模型及基于树的集成学习模型是较为常用的效果较好的预测模型。我们以下构建一个随机森林模型。 随机森林是一种集成学习方法,通过构建多个决策树并结合其预测结果来提高模型的准确性和稳定性。在MATLAB中,可以…...
【江苏-无锡】《无锡市市级政务信息化建设及运行维护项目支出预算标准(试行)》 -省市费用标准解读系列10
2023年3月28日,无锡市政府投资评审中心出台《无锡市市级政务信息化建设及运行维护项目支出预算标准(试行)》,此标准是为进一步提高财政评审效率,规范评审行为,保证评审质量,节约政府投资&#x…...
2024-11-12 问AI: [AI面试题] 您将如何设计一个人工智能系统来预测电信公司的客户流失?
文心一言 设计一个人工智能系统来预测电信公司的客户流失,是一个复杂但至关重要的任务,它涉及到多个步骤和关键要素。以下是一个详细的设计方案: 一、明确需求和目标 在设计智能系统之前,需要明确系统的需求和目标,…...
【数字静态时序分析】复杂时钟树的时序约束SDC写法
以上图为例,SoC芯片上往往存在几种不同的时钟源,有pll时钟、环振时钟、外部的晶振时钟,在SoC不同的模块或者不同的运行阶段使用的时钟也往往不同,所以在使用的时候,相同的模块会出现选择不同的时钟源的情况。上图的情形…...
springboot苍穹外卖实战:五、公共字段自动填充(aop切面实现)+新增菜品功能+oss
公共字段自动填充 不足 比起瑞吉外卖中的用自定义元数据类型mybatisplus的实现,这里使用的是aop切面实现,会麻烦许多,建议升级为mp。 定义好数据库操作类型 sky-common中已经定义好,OperationType。 自定义注解 AutoFill co…...
Go 语言中,golang结合 PostgreSQL 、MySQL驱动 开启数据库事务
Go 语言中,golang结合 PostgreSQL 、MySQL驱动 开启数据库事务 PostgreSQL代码说明: MySQL代码说明: PostgreSQL 在 Go 语言中,使用 database/sql 包结合 PostgreSQL 驱动(如 github.com/lib/pq)可以方便地…...
Git核心概念
目录 版本控制 什么是版本控制 为什么要版本控制 本地版本控制系统 集中化的版本控制系统 分布式版本控制系统 认识Git Git简史 Git与其他版本管理系统的主要区别 Git的三种状态 Git使用快速入门 获取Git仓库 记录每次更新到仓库 一个好的 Git 提交消息如下&#…...
网络安全技术在能源领域的应用
摘要 随着信息技术的飞速发展,能源领域逐渐实现了数字化、网络化和智能化。然而,这也使得能源系统面临着前所未有的网络安全威胁。本文从技术的角度出发,探讨了网络安全技术在能源领域的应用,分析了能源现状面临的网络安全威胁&a…...
这些场景不适合用Selenium自动化!看看你踩过哪些坑?
Selenium是自动化测试中的一大主力工具,其强大的网页UI自动化能力,让测试人员可以轻松模拟用户操作并验证系统行为。然而,Selenium并非万能,尤其是在某些特定场景下,可能并不适合用来自动化测试。本文将介绍Selenium不…...
PHP反序列化靶场(php-SER-libs-main 第一部分)
此次靶场为utools-php-unserialize-main。适合有一定基础的师傅,内容是比较全面的,含有我们的大部分ctf中PHP反序列化的题型。 level1: <?php highlight_file(__FILE__); class a{var $act;function action(){eval($this->act);} } …...
基于大数据爬虫+Python+SpringBoot+Hive的网络电视剧收视率分析与可视化平台系统(源码+论文+PPT+部署文档教程等)
博主介绍:CSDN毕设辅导第一人、全网粉丝50W,csdn特邀作者、博客专家、腾讯云社区合作讲师、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流✌ 技术范围…...
OBS智能背景移除插件:无绿幕实时抠图与低光增强完整指南
OBS智能背景移除插件:无绿幕实时抠图与低光增强完整指南 【免费下载链接】obs-backgroundremoval An OBS plugin for removing background in portrait images (video), making it easy to replace the background when recording or streaming. 项目地址: https:…...
像素剧本圣殿惊艳案例:故障艺术标题下生成的赛博朋克短剧完整场次
像素剧本圣殿惊艳案例:故障艺术标题下生成的赛博朋克短剧完整场次 1. 像素剧本圣殿创作工具介绍 Pixel Script Temple(像素剧本圣殿)是一款基于Qwen2.5-14B-Instruct深度微调的专业剧本创作工具。这个独特的创作平台将先进的AI推理能力与复…...
Llama-3.2-3B入门指南:Ollama部署详解,从安装到生成第一段文字
Llama-3.2-3B入门指南:Ollama部署详解,从安装到生成第一段文字 1. 认识Llama-3.2-3B:轻量级多语言文本生成专家 Llama-3.2-3B是Meta公司推出的开源大语言模型,属于Llama 3.2系列中的3B参数版本。这个模型特别适合需要快速响应和…...
lingbot-depth-vitl14镜像兼容性说明:insbase-cuda124-pt250-dual-v7底座深度适配细节
lingbot-depth-vitl14镜像兼容性说明:insbase-cuda124-pt250-dual-v7底座深度适配细节 1. 引言:为什么你需要关注这个深度估计模型? 如果你正在做机器人、自动驾驶或者AR/VR相关的项目,肯定遇到过这样的问题:怎么让机…...
别再手动写Excel了!用Coze+GPT-4o,5分钟把Word需求文档变成测试用例表格
从Word到Excel:零代码打造智能测试用例生成流水线 每次产品需求文档更新后,测试团队最头疼的莫过于手动编写成百上千条测试用例。传统方式下,测试工程师需要反复阅读PRD文档,逐条提取功能点,再按照固定模板填充到Excel…...
如何用StreamCap实现多平台直播内容的自动捕获与管理
如何用StreamCap实现多平台直播内容的自动捕获与管理 【免费下载链接】StreamCap Multi-Platform Live Stream Automatic Recording Tool | 多平台直播流自动录制客户端 基于FFmpeg 支持监控/定时/转码 项目地址: https://gitcode.com/gh_mirrors/st/StreamCap 在数字…...
从入门到精通解析Python Selenium如何模拟浏览器操作
Selenium是一款开源的自动化测试工具,核心优势在于能模拟真实用户操作浏览器(如点击、输入、滚动),并渲染动态加载的网页内容(解决Requests库无法爬取JS动态数据的问题)。 一、Selenium入门准备:…...
intv_ai_mk11快速上手:浏览器输入URL→发送‘帮我写周报’→获得带数据亮点的Word格式草稿
intv_ai_mk11快速上手:浏览器输入URL→发送帮我写周报→获得带数据亮点的Word格式草稿 1. 什么是intv_ai_mk11 intv_ai_mk11是一款基于Llama架构的AI对话助手,拥有7B参数规模,运行在GPU服务器上。它能像真人助手一样理解你的需求࿰…...
nli-distilroberta-base入门教程:零基础理解自然语言推理任务
nli-distilroberta-base入门教程:零基础理解自然语言推理任务 1. 什么是自然语言推理? 自然语言推理(Natural Language Inference,简称NLI)是让计算机理解两段文本之间逻辑关系的任务。想象一下老师批改作业的场景&a…...
GitHub功能全景:从代码创作到企业级方案的技术生态
【导语:GitHub作为全球知名的代码托管平台,提供了丰富多样的功能,涵盖AI代码创作、开发者工作流、应用程序安全等多个领域,还针对不同规模公司、用例和行业提供解决方案,对软件开发行业产生着深远影响。】【GitHub的多…...
