学习golang(10) 初探:协程(1)

简介: 学习golang(10) 初探:协程(1)

这里卡了好久,是因为 进程、线程以及协程 的关系较为难以用文字表达出来。



什么是协程


要弄清楚什么是协程,我们需要先了解下进程 和 线程 之间的关系,我们从内存的角度来看待该问题,我们都知道,进程是操作系统进行资源分配和调度的基本单位。 并且其程序虚拟内存分布图大致如下

image.png


线程是操作系统能够进行调度的最小单位,一个进程至少有一个线程,在上述虚拟内存分布图中,线程会在栈区分配一块区域来存放数据,其他资源则和其他线程共享,例如: 代码段、数据段 以及 堆,其虚拟内存分布大致如下

image.png


协程,也称之为用户态线程或则说轻量级线程,顾名思义,协程是在用户态中自己维护的,系统调用则是通过线程去调用的。这样好处为对于内存而言,申请协程,比申请线程内存开销要小得多。



go 协程


开启协程


golang中,使用关键字go开启协程,例如

image.png


我们执行程序后,输出为

image.png


go中,我们通常将main函数称之为主协程,在主协程中调用其他协程序,我们协程给的次数是100(go worker("斜程处理中",100)),值得注意的是,当主协程执行完毕后,其他协程也给关闭了,我们可以将执行过程整理图示如下:

image.png


那么,我们是否有方法等待协程结束呢? 有的



等待协程执行完毕


我们可以使用sync.WaitGroup来等待协程执行完毕后再执行下面的语句,其方法名和具体含义为

  • (wg *WaitGroup) Add(delta int)

delta增加到waitgroup计数器,该值可能为负数

  • func (wg *WaitGroup) Done()

等同于 (wg *WaitGroup) Add(-1)

  • func (wg *WaitGroup) Wait()

会持续等待,直至waitgroup计数器为0

我们来写一个等待协程执行完毕的例子


image.png


这里有个点,我们为什么将wg.Add(1)放到匿名函数之外呢,如果我们放到匿名函数里面,协程压根就不会跑就结束了。

我们执行下

image.png




协程序小案例


具体代码参见: gitee.com/pdudo/golea…

我们早些时候学习shell的时候,写过多进程拷贝文件且打包的案例,这里将shell代码贴过来一下


image.png


其具体逻辑为:


image.png



我们重新用go协程来写一下,这里贴一下用协程拷贝文件的代码

image.png

具体的可以查看详细代码




总结


我们今天了解了什么是进程、线程 和 协程序(我现在还是晕晕乎乎的),除此之外,我们还了解了go协程,我们可以将main函数看做一个主协程,在主协程中开启其他协程,当主协程执行完毕后,会结束其他协程执行,以及sync.WaitGroup 计数器,最后我们通过一个拷贝案例来逐步了解go协程应用。



相关文章
|
2月前
|
安全 Go
Golang语言goroutine协程并发安全及锁机制
这篇文章是关于Go语言中多协程操作同一数据问题、互斥锁Mutex和读写互斥锁RWMutex的详细介绍及使用案例,涵盖了如何使用这些同步原语来解决并发访问共享资源时的数据安全问题。
79 4
|
27天前
|
前端开发 Java API
vertx学习总结5之回调函数及其限制,如网关/边缘服务示例所示未来和承诺——链接异步操作的简单模型响应式扩展——一个更强大的模型,特别适合组合异步事件流Kotlin协程
本文是Vert.x学习系列的第五部分,讨论了回调函数的限制、Future和Promise在异步操作中的应用、响应式扩展以及Kotlin协程,并通过示例代码展示了如何在Vert.x中使用这些异步编程模式。
42 5
vertx学习总结5之回调函数及其限制,如网关/边缘服务示例所示未来和承诺——链接异步操作的简单模型响应式扩展——一个更强大的模型,特别适合组合异步事件流Kotlin协程
|
2月前
|
Go 调度
Golang语言goroutine协程篇
这篇文章是关于Go语言goroutine协程的详细教程,涵盖了并发编程的常见术语、goroutine的创建和调度、使用sync.WaitGroup控制协程退出以及如何通过GOMAXPROCS设置程序并发时占用的CPU逻辑核心数。
46 4
Golang语言goroutine协程篇
|
25天前
|
安全 Java Go
【Golang入门】简介与基本语法学习
Golang语言入门教程,介绍了Go语言的简介、基本语法、程序结构、变量和常量、控制结构、函数、并发编程、接口和类型、导入包、作用域以及错误处理等关键概念,为初学者提供了一个全面的学习起点。
17 0
|
3月前
|
机器学习/深度学习 存储 人工智能
Golang bytes 包学习
Golang bytes 包学习
23 3
|
3月前
|
NoSQL Unix 编译器
Golang协程goroutine的调度与状态变迁分析
文章深入分析了Golang中goroutine的调度和状态变迁,包括Grunnable、Gwaiting、Grunning和Gsyscall等状态,以及它们之间的转换条件和原理,帮助理解Go调度器的内部机制。
42 0
|
4月前
|
编译器 Go C语言
通过例子学习在golang中调试程序
【7月更文挑战第4天】Go语言支持使用cgo进行汇编调试,官方文档在golang.org/doc/asm。注意,调试Go运行时可能遇到变量不可用或行号错误,需谨慎使用step命令。
66 1
通过例子学习在golang中调试程序
|
6月前
|
Go
golang学习参考记录
golang学习参考记录
|
6月前
|
JSON Go 数据格式
golang学习7,glang的web的restful接口结构体传参
golang学习7,glang的web的restful接口结构体传参
|
6月前
|
JSON Go 数据格式
golang学习6,glang的web的restful接口传参
golang学习6,glang的web的restful接口传参