Go语言入门必知教程-协程(go语言 入门)
liuian 2025-05-09 20:02 40 浏览
Golang中的并发性是指函数独立运行的能力。Goroutines就是能够并发运行的函数,也叫协程,它们是Golang提供作为并发处理操作的方法。
使用go语句创建协程goroutines
要将函数作为goroutine运行,以go语句为前缀调用函数。下面是示例代码块:
sum() // 正常的函数调用,该函数执行完返回后再执行下一条语句,这是同步调用
go sum() // 作为协程的函数调用,不等该函数执行完成直接执行下一条语句,这是异步调用
关键字go调用函数后立即返回,而函数作为协程在后台运行,程序的其余部分同时继续执行。每个Golang程序的main函数都是作为协程启动的,因此每个Golang程序至少运行一个goroutine。
创建协程
在每次调用函数responseSize之前添加go关键字。以下示例代码中有三个responseSize协程同时启动,对http.Get的三个调用也同时进行。程序不会等到一个响应返回后再发送下一个请求。因此,使用goroutines可以快速地打印三个响应的长度。
结果:
C:\Golang>go run main.go
Step1: https://www.baidu.com
Step1: https://www.sina.com.cn/
Step1: https://www.toutiao.com/
Step2: https://www.sina.com.cn/
Step3: https://www.sina.com.cn/
Step4: 116749
Step2: https://www.baidu.com
Step3: https://www.baidu.com
Step4: 79551
Step2: https://www.toutiao.com/
Step3: https://www.toutiao.com/
Step4: 203842
在main函数中添加了一个time.Sleep的方法,它可以防止main函数在协程结束之前退出。调用time.Sleep(10*time.Second)将使main协程睡眠10秒。
等待协程执行完成
sync包的中WaitGroup类型用来等待程序执行完所有在主函数中启动的协程。它维护一个记录协程数量的计数器,WaitGroup的Wait方法阻塞程序的执行,直到WaitGroup计数器为零,程序才继续往下执行。
调用WaitGroup的Add方法用于向WaitGroup添加计数器。
在协程里面使用defer语句调用WaitGroup的Done方法来减少WaitGroup计数器。
调用WaitGroup的Wait方法等待程序完成所有协程。
在主函数内部调用Wait方法,该方法阻止程序执行,直到WaitGroup计数器达到0的值,确保执行完所有协程。
结果:
C:\Golang>go run main.go
Start Goroutines
Step1: https://www.toutiao.com/
Step1: https://www.baidu.com
Step1: https://www.sina.com.cn/
Step2: https://www.sina.com.cn/
Step3: https://www.sina.com.cn/
Step4: 116749
Step2: https://www.baidu.com
Step3: https://www.baidu.com
Step4: 79801
Step2: https://www.toutiao.com/
Step3: https://www.toutiao.com/
Step4: 203842
从协程里获取值
从协程里获取值的最便捷的方法是通道。通道是连接并发性协程的管道。将值从一个协程里发送到通道中,另一个协程或同步函数再从通道里接收这些值。
结果:
C:\Golang>go run main.go
79655
运行和暂停协程的执行
使用管道可以运行和暂停协程的执行。管道就像是协程之间的协调者,用来进行这些操作。
结果:
1
2
3
4
Pause
Play
5
6
7
8
9
Stop
使用原子函数修复竞争条件
由于对共享资源的访问不同步,并试图同时对该资源进行读写,因此会出现竞争使用资源的情况。
原子函数提供同步访问整型和指针的低级锁定机制。原子函数通常用于修复竞争条件。
sync包中atomic子包的函数通过锁定对共享资源的访问来支持同步协程。
atomic包中的AddInt32函数通过强制一次只有一个协程可以执行和完成加法操作来同步整型值的更新。当协程试图调用任何atomic包的函数时,它们会自动地同步访问被限定的变量。
结果:
C:\Golang>go run -race main.go
Counter: 15
如果使用counter++代替atomic.AddInt32(&counter, 1),则结果如下:
C:\Golang>go run -race main.go
==================
WARNING: DATA RACE
Read at 0x0000006072b0 by goroutine 7:
main.increment()
C:/Golang/main.go:31 +0x76
Previous write at 0x0000006072b0 by goroutine 8:
main.increment()
C:/Golang/main.go:31 +0x90
Goroutine 7 (running) created at:
main.main()
C:/Golang/main.go:18 +0x7e
Goroutine 8 (running) created at:
main.main()
C:/Golang/main.go:19 +0x96
==================
Counter: 15
Found 1 data race(s)
exit status 66
使用互斥锁Mutex定义关键代码
互斥锁用于创建关键代码,关键代码内访问资源,从而确保一次只能有一个协程执行该部分代码。
结果:
C:\Golang>go run -race main.go
PHP stands for Hypertext Preprocessor.
PHP stands for Hypertext Preprocessor.
The Go Programming Language, also commonly referred to as Golang
The Go Programming Language, also commonly referred to as Golang
Counter: 4
由互斥锁的Lock()方法和Unlock()定义关键代码保护对计数器的更新。
相关推荐
- winxp升级包下载(xp 升级)
-
题主你好,XP系统要升级成WIN7很简单,方法如下:1,下载win7系统iso镜像到本地硬盘,右键使用WinRAR等工具解压出来2,将最大的win7.gho文件和Onekeyghost工具放到同一目...
- windows 7电脑配置要求(windows7电脑配置要求)
-
官方推荐最低配置:处理器:1GHz32位或者64位处理器内存:1GB及以上显卡:支持DirectX9128M及以上(开启AERO效果)硬盘空间:32位16G以上(主分区,NTFS格式)...
- ie主页被360锁定不能修改(ie浏览器首页被锁定360导航怎么取消百度知道)
-
法一、点击开始,运行,键入msconfig点击“确定”,在弹出的窗口中切换到“启动”选项卡,禁用可疑程序启动项。法二、1、打开360安全卫士进入“更多”;2、主页防护;3、在打开的对话框中进行设...
- 镜像文件是干嘛的(镜像文件有什么用)
-
所谓镜像文件其实和ZIP压缩包类似,它将特定的一系列文件按照一定的格式制作成单一的文件,以方便用户下载和使用,例如一个测试版的操作系统、游戏等。镜像文件不仅具有ZIP压缩包的“合成”功能,它最重要的特...
- office免安装版(office免安装版什么意思)
-
1先打开安装程序输入安装序列号KEY,进行安装,在弹出来的界面里我们选择自定义安装;2在【文件位置】选项中选择好文件位置,一般大点的软件我们选择C盘以外的位置安装,可以直接点浏览选择,也可以直接将现有...
- 笔记本可以外接显卡吗(笔记本电脑核显和独显的区别)
-
目前市面上有许多笔记本电脑支持外接显卡,这些笔记本通常具备Thunderbolt3或USB-C接口,这些接口可以通过外接显卡扩展图形性能。例如,戴尔XPS系列、华硕ROG系列、雷蛇Blade系列等都...
- 深度启动盘(深度启动盘安装系统教程)
-
要制作深度系统的启动盘,需要首先下载深度系统的镜像文件,然后选择一个合适的软件进行制作。推荐使用Rufus或Etcher等工具,将镜像文件写入U盘或光盘中,并设置好启动顺序。接着将制作好的启动盘插入电...
- 免费看电影的网站是什么(免费的看电影网站有哪些)
-
优选优酷,不过现在的乐视好的,片源十分高清,如果网速一般就选优酷,播放流畅,片源最多。我个人比较喜欢看电影电视,所以市面上有的播放器都有在用,有一定的经验。如果是下播放器的话,一般网速人又懒就选PP...
- 有wifi电脑却上不了网(有wifi但是电脑连不上网是什么原因经常性的)
-
有几个可能的原因导致电脑无法通过WiFi上网。首先,可能是WiFi信号不稳定或弱,可以尝试靠近路由器或重启路由器来改善信号。其次,可能是电脑的网络设置有问题,可以检查IP地址、DNS设置等是否正确。另...
- 快用苹果助手官方网站(快用苹果助手官方网址)
-
PP助手、爱思助手、当乐助手、海马苹果助手、91苹果助手、同步推手机助手、快用苹果助手、等等都是不错的第三方助手!第三方应用助手是一款智能手机的PC端管理客户端。将应用助手安装到您的PC上,然后可以选...
- win7重置系统后需要用户名和密码
-
如果忘了WINDOS开机密码,有两种最常用的方法:第一种:开机后,按下F8进入”带命令提示符的安全”模式,输入”NETUSER+用户名+123456/ADD”可把某用户的密码强行设置为”12345...
- qq下载2025手机版(qq下载2020手机版)
-
目前来看的话java版的QQ还是可以用的。.我们需要用那种比较老式的塞班系统手机才能下载安装使用,就目前的时代使用它的意义就看我们自己怎么理解了,不过社会在进步,科技也在发展,要想更强时代的潮流,万物...
- nod32(NOD32手机版)
-
nod32是斯洛伐克共和国,简称斯洛伐克,是中欧的一个内陆国家。打开nod32,在主窗口右上角有一个设置按钮,单击它就会出现一个下拉菜单,再点击用户名和密码设置即可出现你第一次申请时的用户名和密码1...
- 一周热门
- 最近发表
- 标签列表
-
- python判断字典是否为空 (50)
- crontab每周一执行 (48)
- aes和des区别 (43)
- bash脚本和shell脚本的区别 (35)
- canvas库 (33)
- dataframe筛选满足条件的行 (35)
- gitlab日志 (33)
- lua xpcall (36)
- blob转json (33)
- python判断是否在列表中 (34)
- python html转pdf (36)
- 安装指定版本npm (37)
- idea搜索jar包内容 (33)
- css鼠标悬停出现隐藏的文字 (34)
- linux nacos启动命令 (33)
- gitlab 日志 (36)
- adb pull (37)
- python判断元素在不在列表里 (34)
- python 字典删除元素 (34)
- vscode切换git分支 (35)
- python bytes转16进制 (35)
- grep前后几行 (34)
- hashmap转list (35)
- c++ 字符串查找 (35)
- mysql刷新权限 (34)
