go并发编程之一:并发与并行的区别、go语言并发优势

76、Go并发编程实战:从基础到实战案例解析 本文通过实战案例,深入浅出地介绍了Go语言的并发编程特性。从基础的goroutine和channel,到生产者消费者模型,再到Web服务器和并发爬虫,以及并发排序,全方位展示了Go在并发编程方面的优势和应用。同时,文中还提到了一些实用技巧和最佳实践,帮助读者更好地理解和应用Go的并发编程。 阅读详情

并发与并行的区别

并发

并发(concurrency):指在同一时刻只能有一条指令执行,但多个进程指令被快速的轮换执行,使得在宏观上具有多个进程同时执行的效果,但在微观上并不是同时执行的,只是把时间分成若干段,使多个进程快速交替的执行。

并行

并行(parallel)::在同一时刻有多条指令在多个处理器上同时执行。

例子:

  • 并发是两个队列交替使用一台咖啡机
  • 并行是两个队列同时使用两台咖啡机

go语言并发优势

进程与线程

  • 进程:是程序在操作系统中的一次执行过程,系统进行资源分配和调度的一个独立单位。
  • 线程:是进程的一个执行实体,是 CPU 调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。

一个进程可以创建和撤销多个线程,同一个进程中的多个线程之间可以并发执行。

线程与协程

  • 协程:独立的栈空间,共享堆空间,调度由用户自己控制,本质上有点类似于用户级线程,这些用户级线程的调度也是自己实现的。
  • 线程:一个线程上可以跑多个协程,协程是轻量级的线程。

优雅的并发编程范式,完善的并发支持,出色的并发性能是Go语言区别于其他语言的一大特色。使用Go语言开发服务器程序时,就需要对它的并发机制有深入的了解。

有人把Go比作 21世纪的C语言,第一是因为Go语言设计简单,第二,21世纪最重要的就是并发程序设计,而Go从语言层面就支持了并法。同时,并发程序的内存管理有时候是非常复杂的,而Go语言提供了自动垃圾回收机制。
Go语言为并发编程而内置的上层API基于CSP(communicating sequential processes,顺序通信进程)模型。这就意味着显式锁都是可以避免的,因为Go语言通过安全的通道发送和接受数据以实现同步,这大大地简化了并发程序的编写。
一般情况下,一个普通的桌面计算机跑十几二十个线程就有点负载过大了,但是同样这台机器却可以轻松地让成音上千甚至过万个goroutine进行资源竞争。

线程与协程的通俗说明

本小节来自:点击跳转https://zhuanlan.zhihu.com/p/169426477
表面上看协程和线程似乎是同一个东西,能达到的效果也相同,但是在底层的实现上却有着非常大的区别,在服务器端的绝大部分应用中,协程要比线程节省资源的多。

通俗易懂的讲,线程是操作系统的资源,当java程序创建一个线程,虚拟机会向操作系统请求创建一个线程,虚拟机本身没有能力创建线程。而线程又是昂贵的系统资源,创建、切换、停止等线程属性都是重量级的系统操作,非常消耗资源,所以在java程序中每创建一个线程都需要经过深思熟虑的思考,否则很容易把系统资源消耗殆尽。

而协程,看起来和线程差不多,但创建一个协程却不用调用操作系统的功能,编程语言自身就能完成这项操作,所以协程也被称作用户态线程。我们知道无论是java还是go程序,都拥有一个主线程,这个线程不用显示编码创建,程序启动时默认就会创建。协程是可以跑在这种线程上的,你可以创建多个协程,这些协程跑在主线程上,它们和线程的关系是一对多。如果你要创建一个线程,那么你必须进行操作系统调用,创建的线程和主线程是同一种东西。显然,协程比线程要轻量的多。

既然协程这么优秀,为什么不彻底替代线程呢?事实上协程和线程完全不是两个相同层面的东西,完全谈不上替代一说,协程可以说是一个独立于线程的功能,它是在线程的基础上,针对某些应用场景进一步发展出来的功能。我们知道,线程在多核的环境下是能做到真正意义上的并行执行的,注意,是并行,不是并发,而协程是为并发而生的。

打个简单的比方吧,射雕英雄传看过吧,周伯通教郭靖一手画圆,一手画方,两只手同时操作,左右互搏,这个就是并行。普通人肯定做不到,不信你试试。你不能并行,却可以并发,你先左手画一笔,然后右手画一笔,同一时候只有一只手在操作,来回交替,直到完成两个图案是,这就是并发,协程主要的功能。
在这里插入图片描述

想象一下业务场景,你需要执行两个互不依赖的sql查询,为了减少等待时间,常规的操作肯定主线程执行sqlB的同时另起一个线程执行sqlA,使两个sql并行执行。然而你会发现,执行两个sql的线程大多数时间只是在等待数据库服务器的响应,线程只是处于阻塞等待状态,而不是疯狂运转,而线程的创建、切换又很消耗系统资源,显然这很浪费。这个时候就该协程大展身手了,你可以在主线程中创建一个协程用于执行sqlB,然后再在主线程中执行sqlA,协程和线程一样,不会阻塞主线程,所以sqlB得到结果后,你可以通过语言的api去看看在协程中的sql执行完毕了没有,如果没有则等待,如果执行完毕了就拿结果,和线程操作几乎一摸一样。至于sqlA和sqlB是否真正在并行执行根本无所谓。为什么呢? 我们假设执行一个sql需要三步,提交sql、等待、获得结果 ,其中第一步和第三步极省时,只要1毫秒一步,而第二步却要1000毫秒,那么使用并行的多线程执行两个sql,你只要花掉1002毫秒,而使用并发的协程你要花掉1004毫秒,但是线程比协程多消耗一个线程的资源,请问你会为了这2毫秒而选择多线程吗,显然不可能,创建线程的开销都要大于节省下来的时间,这就是协程存在的理由。
在这里插入图片描述
而服务器端开发中,大多数时候都是要花大量等待时间的场景,也就是所谓的IO密集,协程极为适合这种场景,而go又主打协程,直接从语法层面支持,切中了以往开发高性能程序太过于复杂的痛点,因此广受程序员们的欢迎。java其实也可以模拟出协程的效果,比如用nio和多线程,也能假装goroutines的效果,但实际操作起来太过于麻烦,还要掌握一大堆枯涩的概念,完全没有goroutines的优雅。所以在并发性能上,go完胜java。换言之,go比java更适应高并发场景,能更优雅方便的写出高并发程序。
在这里插入图片描述
在这里插入图片描述
以上小节来自:点击跳转https://zhuanlan.zhihu.com/p/1694

goroutine和协程的区别

goroutine是协程的go语言实现,相当于把别的语言的类库的功能内置到语言里。从调度上看,goroutine的调度开销远远小于线程调度开销。
不同的是:Golang在runtime,系统调用等多方面对goroutine调度进行了封装和处理,即goroutine不完全是用户控制,一定程度上由go运行时(runtime)管理,好处:当某goroutine阻塞时,会让出CPU给其他goroutine。

个人学习笔记,不喜勿喷

我曾七次鄙视自己的灵魂:
第一次,当它本可进取时,却故作谦卑;
第二次,当它空虚时,用爱欲来填充;
第三次,在困难和容易之间,它选择了容易;
第四次,它犯了错,却借由别人也会犯错来宽慰自己;
第五次,它自由软弱,却把它认为是生命的坚韧;
第六次,当它鄙夷一张丑恶的嘴脸时,却不知那正是自己面具中的一副;
第七次,它侧身于生活的污泥中虽不甘心,却又畏首畏尾。 —卡里·纪伯伦撒旦;

Go并发编程机制 Go语言并发的详细介绍 阅读详情

相关推荐

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

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

景天科技苑 5万+

java 协程_线程和协程的区别的通俗说明

表面上看协程和线程似乎是同一个东西,能达到的效果也相同,但是在底层的实现上却有着非常大的区别,在服务器端的绝大部分应用中,协程要比线程节省资源的多。通俗易懂的讲,线程是操作系统的资源,当java程序创建一个线程,虚拟机会向操作系统请求创建一个线程,虚拟机本身没有能力创建线程。而线程又是昂贵的系统资源,创建、切换、停止等线程属性都是重量级的系统操作,非常消耗资源,所以在java程序中每创...

weixin_39680380的博客 331

Anaconda/Miniconda的删除和安装

要在 MacBook 上删除 Anaconda 或 Miniconda,并重新安装它,您可以按照以下步骤进行操作。

qq_27390023的博客 3026

go高并发之路——go语言如何解决并发问题

GO并发编程基础。

wenai1292的博客 1531

win10自动修复-无限循环【通用完美】超简单解决办法

2020.02.14今个我的笔记本电脑(Thinkpad Carbon 7 X1)(win10)早晨起来发现蓝屏,上面显示自动修复失败,重启后依然自动修复失败,不断手动重启,始终是修复失败。然后上网开始搜集资料找解决办法。 前边介绍关闭自动修复,如何找出错文件的方法;如果想看最终解决办法,直接看第三部分 上网就会发现这种现象很常见,同时是电脑自动安装系统更新,或者安装某些驱动出现。解决办法也大...

y15941300574的博客 19万+

Keil 丢失编译器版本5、内核文件core_cm3.c报错

若用的是旧版本的core_cm3.c ,就使用编译器v5编译工程;若想用编译器v6,就更新4个相关的内核文件:(CMSIS:Cortex Microcontroller Software Interface Standard,ARM Cortex™ 微控制器软件接口标准)

qq_52804040的博客 6238

Go语言并发编程

go语言并发编程、加锁、并发。

weixin_46042817的博客 1379

BUUCTF--[OGeek2019]babyrop

才学习了基本的ROP流程,到处找题练,不过也没做出来几道题,以这道32位的题作为例题吧。 这道题是BUUCTF上pwn练习题里的[OGeek2019]babyrop。 代码审计 老规矩先checksec一下: 没有canary保护,nx保护开启排除shellcode可能性,FULL RELEO为地址随机化。 观察主函数,先设定了一个闹铃,到时间就会强制退出程序,解除闹铃的方法在上一篇博客中提到过了, 这道题中闹铃函数依然对我们解题起不到什么干扰作用。 主函数的思路大概是:生成一个随机数,把这个随机数作为

N1rvana的博客 6004

『每周译Go』以Go为例-探究并行与并发的区别

在软件内并行是指多条指令同时执行。每个编程语言都有各自实现并行,或者像Go,将并行作为语言的一部分,提供原生支持。并行让软件工程师能够同时在多核处理器上并行执行任务,从而抛开硬件的物理限制...

Go中国 569

Unity 机械臂控制(二)——从碰撞检测到姿态解算:实现精准抓取

本文详细介绍了Unity中机械臂控制的实现方法,从碰撞检测到姿态解算,涵盖精准抓取的全流程。重点讲解了碰撞检测的分层处理、状态机设计、逆向运动学(IK)算法以及抓取稳定性优化等关键技术,并提供了实用的调试技巧和性能优化建议,帮助开发者实现高效的机械臂控制。

weixin_28693447的博客 304

LDPC码介绍:基础&编码&译码

本博客介绍了LDPC码的基本原理,其中包括校验矩阵的构造、Tanner 图和编译码的基础知识。

渺小的颗星的博客 4309

Go语言的8大优势和3大缺点,从《Go语言学习笔记》开始一步步学习

随着Go语言的越来越普及,在普通程序员踩坑优化后,越来越多的程序员从其他语言转投了Go语言。特别是之前主要编程语言是Python的也转向了Go。 到底有什么魅力让那么多人纷纷去学习呢?下面来介绍一下Go语言的优点和缺点。 Go语言的优点 1、性能 Go 极其地快。其性能与 Java 或 C++相似。在我们的使用中,Go 一般比 Python 要快 30 倍。 2、语言性能很重要 对很多...

肥小强知识分享 1万+

华为OD机试真题 新系统 2026-04-26 Python&JS 实现【项目模块依赖构建顺序规划】

某公司正在开发一个大型软件系统,系统包含 N 个模块,每个模块之间存在构建依赖关系。例如,模块 A 可能依赖于模块 B,这意味着必须先构建模块 B,才能构建模块 A。 请根据依赖关系,输出所有可能的模块构建顺序(按照构建顺序排列模块名称),要求:

MISAYAONE的博客 403

Go语言并发详解

文章目录一、Go语言并发简述(并发的优势)进程/线程并发/并行协程/线程Goroutine 介绍channel二、Go语言goroutine(轻量级线程)使用普通函数创建 goroutine1) 格式2) 例子使用匿名函数创建goroutine1) 使用匿名函数创建goroutine的格式2) 使用匿名函数创建goroutine的例子提示三、Go语言并发通信四、Go语言竞争状态简述Goroutine 7 (finished) created at: main.main() D:/code/src/m

qq_41854911的博客 1万+

华为OD技术面八股文_C++_01

汇总华为OD技术面C++方向八股文真题,并提供详细解答。

qq_45776114的博客 1884

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

并发并行与Go并发编程

并发与并行 并发(concurrency) 并发的关注点在于任务切分。举例来说,你是一个创业公司的CEO,开始只有你一个人,你一人分饰多角,一会做产品规划,一会写代码,一会见客户,虽然你不能见客户的同时写代码,但由于你切分了任务,分配了时间片,表现出来好像是多个任务一起在执行。 并行(parallelism) 并行的关注点在于同时执行。还是上面的例子,你发现你自己太忙了,时间分

天鸣Blog 7857

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Go语言的并发编程

Go语言里的并发指的是能让某个函数独立于其他函数运行的能力。当一个函数创建为协程(goroutine)时,Go语言会将其视为一个独立的工作单元,这个单元会被调度到可用的逻辑处理器上执行。 并发编程基础 1、并发与并行(理论没看懂) 理解操作系统的线程(thread)和进程(process),有助于理解Go语言运行时调度器如何得用操作系统来并发运行goroutine。 并行是让不同的代码片段同时在不同的物理处理器上执行。并行的关键是同时做很多事情,而并发是指同时管理很多事情,这些事情可能只做了一半就被

DXB2021的博客 2780

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Go语言---并发编程以及资源竞争(goroutine、runtime)

并行(parallel):指在同一时刻,有多条指令在多个处理器上同时执行。并发(concurrency):指在同一时刻只能有一条指令执行,但多个进程指令被快速的轮换执行,使得在宏观上具有多个进程同时执行的效果,但在微观上并不是同时执行的,只是把时间分成若干段,使多个进程快速交替的执行。

m0_73537205的博客 1145

Go 语言并发编程初体验:简洁高效

Go语言是谷歌推出的一种的编程语言,可以在不损失应用程序性能的情况下降低代码的复杂性。谷歌软件工程师罗布派克(Rob Pike)说:我们之所以开发Go,是因为过去10多年间软件开发的难度令人沮丧。和今天的C++或C一样,Go是一种系统语言,使用它可以进行快速开发。计算机硬件技术更新频繁,性能提高很快。目前主流的编程语言发展明显落后于硬件,不能合理利用多核多CPU的优势提升软件系统性能。软件系统复杂度越来越高,维护成本越来越高,目前缺乏一个足够简洁高效的编程语言。

二蛋的博客 1093

并发编程 - go版

摘要:本文介绍了Go语言并发编程的核心机制。首先解释了进程、线程和协程的概念差异,重点阐述了Go的goroutine轻量级特性(4-5KB栈内存)及其高并发优势。其次详细解析了GPM调度模型(Goroutine、Processor、Machine)的协作机制。然后介绍了runtime包的关键功能:Gosched(协程让渡)、Goexit(终止协程)和GOMAXPROCS(CPU核数控制)。最后深入讲解了channel通信机制,包括无缓冲通道的同步特性、有缓冲通道的异步特性,以及通道的创建、发送、接收、关闭等

本郡主是喵 1155

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

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

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

第09章 Go语言并发,Golang并发

并发指在同一时间内可以执行多个任务。并发编程含义比较广泛,包含多线程编程、多进程编程及分布式程序等。本章讲解的并发含义属于多线程编程。 Go 语言通过编译器运行时(runtime),从语言上支持了并发的特性。Go 语言的并发通过goroutine特性完成。goroutine 类似于线程,但是可以根据需要创建多个 goroutine 并发工作。goroutine 是由 Go 语言的运行时调度完成,而线程是由操作系统调度完成。 Go 语言还提供channel在多个 goroutine 间进行通信。gor...

心情第一 1401

青少年编程与数学 02-004 Go语言Web编程 16课题、并发编程

本文探讨了并发编程的概念、关键概念、Go语言中的并发模型以及异步编程。并发编程允许程序同时执行多个任务,提高性能和资源利用率。关键概念包括线程、进程、协程、并行、并发、同步等。

明月看潮生的博客 1554

Go 语言编程基础:并发编程

Goroutine是 Go 中的轻量级线程,由 Go 运行时调度。Goroutines 可以通过go关键字来启动,并由 Go 运行时负责管理。Channel是 Goroutines 之间通信的机制,用于在不同的 Goroutines 之间传递数据。可以通过make函数创建 Channel,并指定数据传递的类型。示例ch := make(chan int) // 创建一个传递 int 类型的 Channel。

wushengT的博客 880

Go并发编程详解

随着硬件的发展,并发程序变得越来越重要。Web服务器会一次处理成千上万的请求。平板电脑和手机app在渲染用户画面同时还会后台执行各种计算任务和网络请求。即使是传统的批处理问题--读取数据,计算,写输出--现在也会用并发来隐藏掉I/O的操作延迟以充分利用现代计算机设备的多个核心。计算机的性能每年都在以非线性的速度增长。

金戈鐡馬 1552
上一篇: mac下安装brew
下一篇: go语言中,main函数调用其它文件夹下的函数
java_xxxx
博客等级 码龄9年 127粉丝 99原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值