我的编程空间,编程开发者的网络收藏夹
学习永远不晚

GO并发编程使用方法是什么

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

GO并发编程使用方法是什么

这篇文章主要介绍了GO并发编程使用方法是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇GO并发编程使用方法是什么文章都会有所收获,下面我们一起来看看吧。

啥是并发编程呢

指在一台处理器上同时处理多个任务

此处说的同时,可不是同一个时间一起手拉手做同一件事情

并发是在同一实体上的多个事件,而这个事件在同一时间间隔发生的,同一个时间段,有多个任务执行,可是同一个时间点,只有一个任务在执行

为啥要有并发编程

随着互联网的普及,互联网用户人数原来越多,这对系统的性能带来了巨大的挑战。

我们要通过各种方式来高效利用硬件的性能(压榨),从而提高系统的性能进而提升用户体验,提升团队或者企业的竞争力。

并发是为了解决什么问题?目的是啥?

充分的利用好处理器的每一个核,以达到最高的处理性能,尽可能的运用好每一块砖

可是由于现在我们使用的CPU,内存,IO三者之间速度不尽相同

我们为了提高系统性能,计算机系统会将这三者速度进行平衡,以达到最优的效果,都有如下措施:

  • 操作系统增加了进程线程,以分时复用 CPU,进而均衡 CPUI/O 设备的速度差异;

  • CPU 增加了缓存,以均衡与内存的速度差异;

  • 编译程序优化指令执行次序,使得缓存能够得到更加合理地利用。

说到进程和线程,他们都是干啥的呢,咱们顺带说一下?

进程是程序在操作系统中的一次执行过程

是 系统进行资源分配和调度的一个独立单位

线程是进程的一个执行实体

是 CPU 调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。

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

讲到并发编程不得不说并发和并行有啥区别?是不是总是有小伙伴弄不清楚他们到底是啥区别,好像一样,又好像不一样

并发和并行的区别

一言蔽之,区别如下:

并发

多线程程序在一个核的 CPU 上运行

并行

多线程程序在多个核的 CPU 上运行

并发就像多个小伙伴跑接力,同一个时间点只会有一个小伙伴在跑,互相有影响

GO并发编程使用方法是什么

并行就像是多个小伙伴同一个起点一起跑,互不干扰

GO并发编程使用方法是什么

我们需要记住一点,再强调一波:

并发不是并行

并发主要由切换时间片来实现"同时"运行

并行则是直接利用多核实现多线程的运行,

在 GO 可以设置使用核数,以发挥多核计算机的能力,不过设置核数都是依赖于硬件的

那么,讲到GO的并发编程,就必须上我们的主角,那就是协程

协程 goroutine 是啥

协程是一种程序组件

是由子例程(过程、函数、例程、方法、子程序)的概念泛化而来的

子例程只有一个入口点且只返回一次,而协程允许多个入口点,可以在指定位置挂起和恢复执行。

协程和线程分别有啥特点嘞

协程

独立的栈空间,共享堆空间,调度由用户自己控制

本质上有点类似于用户级线程,这些用户级线程的调度也是自己实现的。

线程

一个线程上可以跑多个协程,协程是轻量级的线程

GO 高并发的原因是啥

  • goroutine 奉行通过通信来共享内存

  • 每个一个GO的实例有4~5KB的栈内存占用,并且由于 GO 实现机制而大幅减少的创建和销毁开销

  • Golang 在语言层面上就支持协程 goroutine

GOLANG并发编程涉及哪些知识点呢

  • 基本协程的原理,实现方式,虽然说,GO中使用协程很方便,可以我们必须要知其然而值其所以然

  • Goroutine 池

  • runtime 包的使用

  • Channel 通道

  • 定时器

  • 并发且安全的锁

  • 原子操作

  • select 多路复用

  • 等等...

Goroutine的那些事

我们写C/C++的时候,我们必然也是要实现并发编程

我们通常需要自己维护一个线程池,并且需要自己去包装一个又一个的任务,同时需要自己去调度线程执行任务并维护上下文切换

且做线程池的时候,我们需要自己做一个线程管理的角色,灵活动态压缩和扩容

可是能不能有这样一种机制,我们只需要定义多个任务,让系统去帮助我们把这些任务分配到CPU上实现并发执行

GO里面就正好有这样的机制

goroutine 的概念类似于线程

goroutine 是由Go的运行时(runtime)调度和管理的

Go程序会智能地将 goroutine 中的任务合理地分配给每个CPU

Go 在语言层面已经内置了调度和上下文切换的机制

写 GO 比较爽的一个地方是:

在GO里面,你不需要去自己写进程、线程、协程

我们可以使用 goroutine 包

如何使用 goroutine

我们需要让某个任务并发执行的时候,只需要把这个任务包装成一个函数

专门开启一个 goroutine 协程 去执行这个函数就可以了 , GO一个协程,很方便

一个 goroutine 必定对应一个函数,可以创建多个 goroutine 去执行相同的函数,只是多个协程都是做同一个事情罢了

我们先来使用一下协程,再来抛砖引玉,适当的分享一下

启动单个协程

func Hi() {    fmt.Println("this is Hi Goroutine!")}func main() {    Hi()    fmt.Println("main goroutine!")}

我们一般调用函数是如上这个样子的,效果如下

this is Hi Goroutine!
main goroutine!

其实我们调用协程的话,也与上述类似

我们可以使用 go 后面加上函数名字,来开辟一个协程,专门做函数需要执行的事情

func main() {    go Hi() // 启动一个goroutine 协程 去执行 Hi 函数    fmt.Println("main goroutine!")

实际效果我们可以看到,程序只打印了 main goroutine!

main goroutine!

在程序启动的时候,Go 程序就会为 main() 函数创建一个默认的 goroutine 协程

当 main() 函数返回的时候,刚开辟的另外一个 goroutine 协程 就结束了

所有在 main() 函数中启动的 goroutine 协程 会一同结束,老大死了,其余的傀儡也灰飞烟灭了

我们也可以让主协程等等一定子协程,待子协程处理完自己的事情,退出后,主协程再自己退出,这和我们写C/C++进程 和 线程的时候,类似

简单的,我们可以使用 time.sleep 函数来让主协程阻塞等待

我们也可以使用 上述提到的 使用 select{} 来达到目的

当然也有其他的方式,后续文章会慢慢的分享到

多个协程

那么多个协程又是怎么玩的呢?

我们使用 sync.WaitGroup 来实现goroutine 协程的同步

package mainimport ("fmt""sync")var myWg sync.WaitGroupfunc Hi(i int) {// goroutine 协程 结束就 记录 -1defer myWg.Done()fmt.Println("Hello Goroutine! the ", i)}func main() {for i := 0; i < 10; i++ {// 启动一个goroutine 协程 就记录 +1myWg.Add(1)go Hi(i)}// 等待所有记录 的goroutine 协程 都结束myWg.Wait() }

会有如下输出,每一个协程打印的数字并不是按照顺序来的:

Hello Goroutine! the  9
Hello Goroutine! the  4
Hello Goroutine! the  2
Hello Goroutine! the  3
Hello Goroutine! the  6
Hello Goroutine! the  5
Hello Goroutine! the  7
Hello Goroutine! the  8
Hello Goroutine! the  1
Hello Goroutine! the  0

还是同样的, 如果是主协程先退出,那么子协程还行继续运行吗?

毋庸置疑,主协程退出,子协程也会跟着退出

GO 中的协程

分享如下几个点

GO中的栈是可增长的

一般都有固定的栈内存(通常为2MB),goroutine 的栈不是固定的,goroutine 的栈大小可以扩展到1GB

goroutine 是如何调度

这就不得不提 GPM

GPM是Go语言运行时(runtime)层面实现的,我们先简单了解一下GPM分别代表啥

G

就是个 goroutine ,里面除了存放本 goroutine 信息外 还有与所在P的绑定等信息

P

Processor 管理着一组 goroutine 队列

P 里面会存储当前 goroutine 运行的上下文环境(函数指针,堆栈地址及地址边界)

P 会对自己管理的 goroutine 队列做一些调度(比如把占用CPU时间较长的 goroutine 暂停、运行后续的 goroutine)

当自己的队列消费完了就去全局队列里取,如果全局队列里也消费完了会去其他P的队列里抢任务。

M(machine)

是 Go 运行时(runtime)对操作系统内核线程的虚拟

M 与内核线程一般是一一映射的关系, 一个 groutine 最终是要放到 M上执行

这里的 P 与 M 一般也是一一对应的

P 管理着一组G 挂载在 M 上运行

当一个 G 长久阻塞在一个 M 上时,runtime 会新建一个M,

阻塞 G 所在的 P 会把其他的 G 挂载在新建的M上

这个时候,当旧的 G 阻塞完成或者认为其已经挂了的话,就会回收旧的 M

还有一点

P 的个数是通过 runtime.GOMAXPROCS 设定(最大256),这个数字也依赖于自己的硬件,在并发量大的时候会增加一些 P 和 M ,但不会太多。

关于“GO并发编程使用方法是什么”这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对“GO并发编程使用方法是什么”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注编程网行业资讯频道。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

GO并发编程使用方法是什么

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

GO并发编程使用方法是什么

这篇文章主要介绍了GO并发编程使用方法是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇GO并发编程使用方法是什么文章都会有所收获,下面我们一起来看看吧。啥是并发编程呢指在一台处理器上同时处理多个任务此处说的
2023-07-05

Java并发编程学习方法是什么

这篇文章主要讲解了“Java并发编程学习方法是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java并发编程学习方法是什么”吧!一:并发基础和多线程首先需要学习的就是并发的基础知识,什么
2023-06-02

Go并发编程sync.Cond怎么使用

本篇内容主要讲解“Go并发编程sync.Cond怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Go并发编程sync.Cond怎么使用”吧!简介Go 标准库提供 Cond 原语的目的是,为
2023-06-30

Go并发编程中sync/errGroup怎么使用

本篇内容介绍了“Go并发编程中sync/errGroup怎么使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一.序这一篇算是并发编程的一个
2023-06-25

什么是Java并发编程

本篇内容主要讲解“什么是Java并发编程”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“什么是Java并发编程”吧!Java多线程概述在Java中使用多线程是提高程序并发响应能力的重要手段,但同时
2023-06-15

Go并发编程sync.Cond的具体使用

目录简介详细介绍案例:Redis连接池注意点简介 Go 标准库提供 Cond 原语的目的是,为等待 / 通知场景下的并发问题提供支持。Cond 通常应用于等待某个条件的一组 goroutine,等条件变为 true 的时候,其中一个 gor
2022-06-07

Go并发编程中sync/errGroup的使用

目录一.序二.errGroup2.1 函数签名三.源码3.1 Group3.2 WaitContext3.3 Go3.4 Wait四. 案例五. 参考一.序这一篇算是并发编程的一个补充,起因是当前有个项目,大概の 需求是,根据kafka的分
2022-06-07

Go语言的并发编程和协程使用

Go语言作为一种强大的编程语言,以其简洁、高效的特性而著称。其中,其强大的并发编程和协程使用是其最大的亮点之一。本文将介绍Go语言中并发编程和协程的原理以及具体使用方法,并提供一些代码示例来帮助读者更好地理解。一、并发编程在Go语言中,
Go语言的并发编程和协程使用
2024-03-02

go多线程使用的方法是什么

在Go语言中,多线程的概念被称为Goroutine。Goroutine是一种轻量级的线程,由Go语言的运行时系统管理。创建一个Goroutine非常简单,只需要在函数调用前加上关键字"go"即可。下面是一个简单的示例:package ma
go多线程使用的方法是什么
2024-03-04

掌握Go语言程序中的并发编程方法

在现代软件开发中,并发编程变得越来越重要,特别是在需要处理大量并行任务的情况下。Go语言作为一种支持并发编程的语言,提供了丰富的原生并发特性,能够轻松处理并发任务。本文将介绍如何在Go语言程序中有效地实现并发编程,并给出具体的代码示例。为
掌握Go语言程序中的并发编程方法
2024-03-05

高效并发编程:使用Go WaitGroup和协程池

在Go语言中,可以使用WaitGroup和协程池来实现高效的并发编程。1. WaitGroup:WaitGroup是一个计数器,用于等待一组协程的完成。在主协程中添加计数器的数量,然后在每个协程中完成任务后减少计数器的数量。主协程可以使用W
2023-10-08

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录