Go 并发实战核心编程【一】

Go语言的 的并发编程(Concurrency)核心知识 并发编程是一种计算模型,允许多个计算过程同时进行。Go语言(Golang)是由Google开发的一种编程语言,它以简洁、高效和内置并发支持而著称。这使得Go在处理网络服务、云计算和其他需要高并发的场景中,非常受欢迎。在这篇文章中,我们将深入探讨Go语言的并发编程核心知识,包括Go的并发模型、goroutine、channel、并发控制工具等。 阅读详情

Go 并发实战核心编程【一】

微信公众号

1. 需求
  • 启动一个goroutine,将1-10000的数字放入chan中

  • 启动4个goroutine从chan中读取数字,并计算是不是素数

  • 是素数就讲结果放入结果chan中

  • 最后遍历结果chan,打印素数集合

2. 思路

这道题思路很简单,首先明确一个点就是这个需求有三种类型的goroutine:

  • 第一种类型就是生产者,它主要负责数据的生产;

  • 第二种类型就是消费者,他主要负责消费数据做加工;

  • 第三种类型就是main goroutine,他主要负责调度这些goroutine并且等待他们退出。

明确思路之后我们在深入分析下,这个需求需要三个chan:

  • 第一个就是生产者和消费者之间的通信是需要一个chan的,这个chan就是生产者生产数字放到chan中,消费者从chan取出数字。

  • 第二个就是消费者计算完素数之后结果得放入一个chan中,这个chan需要和main goroutine通信,因为main goroutine需要遍历打印这些素数;

  • 最后一个就是main goroutine需要等待所有消费goroutine的退出,因为我不知道消费者什么时候结束,所以也需要一个chan和main goroutine通信。

因此这个需求需要三种类型的goroutine和三种类型的chan。

3. 编码
package main

import "fmt"

// 生产者
func producer(intChan chan int) {
 fmt.Println("producer goroutine 开始生产数据啦")
 for i:=1; i<10000; i++ {
  intChan <- i
 }

 //生产完毕就关闭
 close(intChan)
 fmt.Println("producer goroutine 退出啦")
}

// 消费者
func consumer(intChan chan int, primeChan chan int, exitChan chan bool) {
 fmt.Println("consumer goroutine 开始消费数据啦")
 for {
  num, ok := <- intChan
  if !ok {
   break //生产者已经关闭intChan 那么消费者读取到关闭信号之后就应该退出
  }

  //计算素数
  flag := true
  for i:=2; i<num; i++ {
   if num%i == 0 {
    flag = !flag
    break
   }
  }

  //素数存储到primeChan中
  if flag {
   primeChan <- num
  }
 }

 // 处理结束之后 退出
 exitChan <- true
 fmt.Println("consumer goroutine 退出啦")
}

func main() {
 intChan := make(chan int, 10000)
 exitChan := make(chan bool, 4)
 primeChan := make(chan int, 5000)

 // 起一个goroutine生产数据
 go producer(intChan)
 
 // 起四个goroutine消费数据
 for i:=0; i<4; i++ {
  go consumer(intChan, primeChan, exitChan)
 }

 // 起一个goroutine等待消费者goroutine退出 并且退出之后关闭结果chan(primeChan)
 // 这里可以在main goroutine中直接同步等待退出,但是考虑到并发特性,还是go func出去等,不要阻塞main goroutine
 go func() {
  for i:=0; i<4; i++ {
   <- exitChan
  }

  close(primeChan)
 }()

    //main goroutine 打印结果
    for v := range primeChan {
     fmt.Println("main goroutine 接收到的素数是:", v)
 }

 fmt.Println("main goroutine 退出啦")
}


4. 小结
  • 谁负责生产数据到chan,谁就负责关闭chan

  • 谁最后处理完chan中数据,就应该通知调用方自己退出了

  • main goroutine一定是程序最后一个goroutine退出的

- END -

Go并发编程在微服务中的应用 - 从理论到实践 随着微服务和云原生架构的持续发展,Go的并发模型将继续发挥重要作用,并在多个方向上演进。Go语言的并发模型为微服务开发提供了独特优势:轻量级goroutine、简洁的channel通信、丰富的同步原语,以及出色的性能和可扩展性。通过本文介绍的各种模式和最佳实践,开发者可以充分利用Go的并发特性,构建高效、可靠、可维护的微服务系统。保持简单,避免过度工程注重错误处理和优雅退出合理控制并发数量持续监控和优化从实践中学习和改进。 阅读详情

相关推荐

Golang并发编程核心:理解sync包与原子操作的精髓

在当今的软件开发中,并发编程变得越来越重要。Golang作为一门天生支持并发的编程语言,为开发者提供了强大的并发编程能力。而sync包和原子操作是Golang并发编程中的关键部分,掌握它们能让我们更高效地处理并发问题。本文的目的就是详细介绍sync包和原子操作的相关知识,范围涵盖核心概念、原理、实际应用等方面。本文首先会介绍相关的术语,然后引入核心概念,解释它们的含义和相互关系。接着会详细讲解核心算法原理、数学模型和公式,通过实际项目案例展示如何运用这些知识。

AI Agent Harness Engineering 881

【Go语言从入门到实战】并发篇

并发篇:协程、共享内存并发机制、CSP并发机制(Channel)、多路选择和超时控制、channel的关闭和广播、任务的取消、Context、并发任务(单例模式、仅需任意任务完成、所有任务完成、对象池、sync.Pool 对象缓存) 另外还有单元测试的内容。

How many ten years in the life time? 1567

56、Go语言并发编程实战:核心概念与高级模式解析

本文深入探讨了Go语言的并发编程,首先介绍了并发编程的核心概念,包括Go Routine、通道(Channel)和锁(Mutex)。接着,通过实战案例,如下载图片、商品秒杀和文件内容合并,详细阐述了如何在实际应用中使用Go语言的并发编程。最后,本文还介绍了工作池和生产者-消费者等高级并发模式,并给出了并发编程的最佳实践,如避免竞态条件、适当创建Go Routine和使用Context进行取消操作等。

silenceallat的博客 973

golang并发编程案例

本文主要学习了生产者和消费者模式、协程管道定时任务的应用和WaitGroup并发控制原理以及底层源码解读。

weixin_54083160的博客 764

Golang go routine调度器:让并发编程更简单高效

Golang(Go)的并发模型以goroutine和channel为核心,而调度器作为goroutine运行的底层引擎,直接影响程序的并发性能和资源利用率。解析调度器的核心架构(GMP模型)和调度策略揭示调度器如何实现轻量级线程的高效管理演示调度器在实际项目中的应用和优化方法覆盖内容包括调度器原理、算法实现、数学建模、实战案例和工具推荐,适用于希望深入理解Go并发机制的开发者。背景介绍:定义目标、读者和术语核心概念:解析GMP模型及调度器架构算法原理:工作窃取、抢占调度等核心算法数学模型。

AI Agent Harness Engineering 1003

Go语言并发编程实战案例解析

本文通过多个代码示例详细讲解Go语言中的并发编程实践,包括使用goroutine与通道实现随机数生成、平方数流、条件转发、消息打印与丢弃等功能。文章还介绍了如何使用等待组实现目录哈希计算、带缓冲的工作队列、并发下载网页以及避免死锁的方法。内容涵盖并发控制、同步机制及通道组合使用技巧。

rr23456的博客 959

Go语言并发编程实践

Go语言是一门现代化的编程语言,以其独特而强大的并发模型而著名。Go通过轻量级的协程(goroutine)和通信机制(channel)实现了高效的并发编程。本篇博客将介绍Go语言的并发模型,讨论并发编程的基本概念和常用模式,并探索如何利用Go的并发特性来提升程序性能和开发效率。 并发编程的重要性 在计算机发展的过程中,单核处理器的性能已经达到物理极限,因此并发编程成为提高程序性能和响应能力的关键...

starsum的博客 405

【Golang】Go语言中如何通过Goroutine快速实现高并发

并发编程是指在一个程序中同时运行多个任务,这些任务可以独立地执行,也可以相互协作。并发编程可以提高程序的执行效率,特别是在处理大量I/O操作或计算密集型任务时。 在Go语言中,并发编程主要通过goroutine和channel来实现。 Goroutine是Go语言独有的并发执行单元,它允许函数或方法并发执行,而无需手动管理线程。 Channel是Go语言中进行goroutine间通信和同步的主要机制。

景天科技苑 5万+

Go语言并发编程实战:掌握并发模型,提升应用性能

微服务架构的核心理念是将应用拆分成多个独立、松耦合的服务,每个服务负责一个单一的功能。这些服务可以独立部署和扩展,有助于提高系统的可维护性和可伸缩性。Go语言的并发模型是它的一大亮点,它让开发者能够轻松地创建并发应用程序。在本篇文章中,我们通过实战代码深入了解了Go语言的并发编程,并学习了如何将其应用于实际项目中。

实践是检验真理的唯一标准 1600

Go并发编程实战:郝林的实践指南

CSP(Communicating Sequential Processes)是一种并发模型,其核心思想是通过通信来同步不同的并发进程。在CSP模型中,进程是相互独立的,它们之间不共享内存,而只能通过消息传递来进行交互。这种模型极大地简化了并发程序设计的复杂性,因为它避免了传统多线程中常见的竞态条件和锁依赖。CSP模型的核心概念包括:进程、通道和消息。进程作为独立的执行单元,通过通道与外界通信。通道可以视为进程间的消息队列,提供了一种机制来保证消息的顺序发送和接收。

weixin_42579969的博客 684

自动驾驶仿真(五)—— 基于Carsim、Prescan、Simulink的联合仿真

自动驾驶仿真五——基于Carsim、Prescan、Simulink的联合仿真1. 联合仿真流程2. CarSim联合仿真配置要点3. Prescan联合仿真配置要点4. Carsim、Prescan、Simulink联合仿真结果5. 参考学习的书目教材 博主前面的博文已经介绍了Carsim和Prescan各自与Matlab/Simulink的相关联合仿真应用实例,并且论述过几款软件各自的优势及用法,CarSim适合动力学模型的建立,PreScan适合行车场景的搭建,Simulink适合控制算法的设计及信号

zhudj08的博客 1万+

使用 Go 语言进行并发编程的实践方法

Go语言是一门开源的编程语言,由谷歌公司开发。它的特点是非常适合进行并发编程,这使得它在云计算、分布式系统、网络编程、大数据等领域得到了广泛应用。在本文中,我将介绍Go语言的并发编程实践方法,包括并发模型、通道、锁、条件变量等方面的内容,以帮助读者更好地理解并发编程。

Mr. 亮先生的博客 531

CANoe.Diva实战:基于CDD的UDS诊断自动化测试全流程解析

本文详细解析了使用CANoe.Diva进行基于CDD的UDS诊断自动化测试的全流程,包括环境搭建、CDD文件配置、测试范围设置、用例生成与验证、CANoe集成测试及报告分析。通过实战经验分享,帮助工程师快速掌握诊断自动化测试技巧,提升测试效率与质量。

weixin_29258297的博客 218

【Go】P17 Go语言并发编程核心(一):深入理解 Goroutine (从入门到实战)

Goroutine 协程,是 Go 语言并发设计的灵魂。它以其轻量级、低开销和强大的调度能力,让开发者能以极其简单的方式编写出高性能的并发乃至并行程序。Goroutinego关键字) 让我们轻松发起并发任务。让我们能可靠地同步和等待任务完成。Go 运行时默认利用多核 CPU,让我们(在计算密集型任务中)“免费”获得并行带来的性能提升。掌握Goroutine,是深入 Go 语言、构建现代化高性能服务的必经之路。2025.10.29 杭州西湖畔。

weixin_43098506的博客 1163

STM32F407+LAN8720网口不通?别慌,手把手教你用CubeMX和HAL库搞定RMII配置与调试

本文详细介绍了STM32F407与LAN8720网口不通的全面排查与解决方法,涵盖硬件检查、CubeMX配置、PHY芯片初始化和LWIP协议栈优化。通过RMII接口配置、时钟树设置和PHY芯片调试,帮助开发者快速定位并解决网络连接问题,提升嵌入式网络开发效率。

weixin_30457551的博客 506

方案设计之亿级排行榜方案设计

该方案通过 “Redis Zset 为核心 + 分治策略为骨架 + 多级优化为细节”,在亿级用户场景下实现了:本质是将 “亿级大问题” 拆解为 “千万级小问题”,用分布式思想和精细化设计平衡性能、可用性与成本。

shine0312的专栏 1100

掌握Go并发:Go语言并发编程深度解析

Go语言作为新兴的语言,其最大的特点就是原生支持并发。作者:鼠鼠我捏,要死了捏

qq_35716689的博客 1万+

《双剑合璧:双 IMU 驱动的高精度 AHRS 实战宝典(基于 ROS2)》

本文系统阐述了基于双IMU的高精度姿态与航向参考系统(AHRS)设计与实现方法。文章首先分析了传统单IMU系统的局限性,提出通过双IMU冗余配置实现性能互补的方案。从硬件设计要点(包括IMU选型策略、电路降噪方法、PCB布局规范),到算法实现方案(互补滤波、卡尔曼滤波等融合算法),再到ROS2软件架构与调优策略,全方位展示了双IMU系统的技术实现路径。特别强调快速性与高精度平衡的方法,包括动态参数调整、双IMU权重优化等核心技巧。最后总结了硬件降噪、算法调优等实用心法。

bother3000的博客 2024

《Go语言核心编程》一书正式上市

背景 从2012年开始接触Go,一直很喜欢这门语言,市面上几乎所有的图书我都会购来阅读,但是总是感觉缺少一本讲述Go语言的三大核心:类型系统、接口、并发的图书,这么多年过去了,一直没有人写,最后我决定动手写一本这个主题的图书,书名叫《Go语言核心编程》。经过近1年的准备,图书已经上市,希望喜欢的小伙伴关注和支持。 这本书有啥特点 不是前篇一律的堆积罗列语法。 本书精炼的使用一个章节介绍了Go语言...

Andes Home 千年的塔 -十年技术,风雨兼程 5333

eNSP-抓包解析TCP三次握手和四次挥手的过程

一、环境搭建 1.设备连接 2.服务器配置 3.客服端配置 二、抓包测试 1.打开抓包软件 2.客户端获取数据 三、抓包结果

小橙子的博客 3350

【ELK】最新版ELK日志搜集,过滤与展示,手把手教你搭建企业级ELK日志平台

ELFK是一套完整的日志集中处理方案。 E:ElasticSearck ES 分布式索引型非关系数据库 存储logstash输出的日志 全文检索引擎,保存的格式是json格式 L:logstash 基于java语言开发的,数据收集引擎。日志的收集,可以对数据进行过滤,分析,汇总,以标准格式输出 K:Kiabana 是es的可视化工具。对es存储的数据进行可视化展示,分析和检索。 F: FileBeat是一个轻量级日志采集器,Filebeat属于Beats家族的6个成员之一。

景天科技苑 7万+

聊聊并发编程,另送5本Golang并发编程新书

大家好,我是飞哥!并发编程并不是一个新话题,但是我觉得在近几年以及未来的时间里,并发编程将显得越来越重要。为什么这样讲,让我们先回到一个基本的问题上来,为什么我们要采用并发编程?关于这个问题可能会有多种答案,但是最根本的答案是受 CPU 硬件发展的影响。摩尔定律原意说的是每隔 18 个月处理器的速度会翻一翻。从 1970 年到 2002 年的这段时间里,硬件确实大致是按照这个规律发展的。但是进入到...

zhangyanfei01的专栏 1372

模型瘦身术:YOLOv5无损剪枝实战教程

本文介绍了一种YOLOv5模型的无损剪枝方法,通过"稀疏训练+结构化剪枝+微调"的流程,在不损失精度的前提下显著减小模型尺寸并提升推理速度。具体步骤包括:1)稀疏训练给参数排优先级;2)裁剪不重要通道;3)微调恢复精度;4)验证效果。实战部分详细展示了从环境搭建到剪枝实现的完整流程,并分析了剪枝后在边缘设备部署、实时检测等场景的优势。该方法可使YOLOv5s模型从14MB缩减至2-3MB,推理速度提升30%-50%,适用于资源受限设备的轻量化部署需求。

LXY_LOVE36的博客 104

Golang如何简化并发编程?

Go语言通过其独特的并发模型和简洁的语法大大简化了并发编程的复杂性。通过使用轻量级的goroutines和直观的channels通信机制,开发者可以更加高效地处理并发任务,从而提高应用的性能和响应速度。然而,在使用Go语言的并发特性时,也需要注意一些关键点,如避免死锁、控制goroutine的数量以及优雅地关闭goroutines等。通过遵循这些注意事项和最佳实践,开发者可以更加高效地利用Go语言的并发优势来构建高性能、高可用的应用。来自:33066.cn/gonglue/163.html。

PrimoRosal的博客 1799

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

【golang学习之旅】Go 语言并发编程(goroutine、channel 的使用)

✅ 适合人群:Golang 开发者 | 并发编程初学者 | 后端开发工程师✅ 文章亮点:深入解析 Goroutine & Channel + 代码示例 + 实战场景✅ 目标:掌握 Go 并发编程核心,让你的代码更高效、更强大!Goroutine是Go语言的轻量级线程,由Go运行时管理,而非操作系统。相比传统线程,Goroutine占用内存小:默认仅2KB栈空间,可动态扩展调度高效:Go运行时管理Goroutine的调度,无需手动创建线程启动成本低:创建Goroutine比创建线程的开销小很多。

程序员林北北的博客 1252

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

golang高级进阶(一):进程、线程、并发、并行、goroutine协程

目录 一、关于进程和线程 1. 进程(Process) 2. 线程 二、关于并发和并行 1. 并发 2. 并行 3. 通俗讲 三、goroutine协程以及主线程 1. 主线程 2. 协程 3. 多协程和多线程 四、go关键词实操 1. 顺序执行 2. 加入go 3. 加入时间 4. 主线程执行快的情况 5. sync.WaitGroup解决不等待 6. 多协程并发并行执行 五、设置golang运行时占用的cpu核数量(不是很重要) 重点:这一篇全是干货,一定要多

genziisme的专栏 6908

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

上一篇: 简历中的项目到底该如何写?面试中该如何介绍项目?看这篇就足够了
下一篇: WeMark免费支持AI生成图片
stackfuture
博客等级 码龄5年 23粉丝 38原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值