百度360必应搜狗淘宝本站头条
当前位置:网站首页 > IT知识 > 正文

Go语言入门必知教程-协程(go语言 入门)

liuian 2025-05-09 20:02 49 浏览

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()定义关键代码保护对计数器的更新。

相关推荐

万能app破解器(万能app软件破解器)

1、以现有的技术手段,是没有办法破解WPA的加密方式(现在基本上全部WIFI的加密方式),WPA的加密方式安全性很高,根本就破不了。2、即使破解密码,人家也有可能设置了MAC地址过滤,还是上不去。3、...

笔记本电脑自带摄像头怎么开启

要使用笔记本电脑自带的摄像头,请按照以下步骤操作:1.打开你的电脑,进入桌面。2.定位摄像头,通常在笔记本电脑的上部或者展开的屏幕的中央位置。3.双击摄像头图标,或者在键盘上按下对应的快捷键,以...

怎么知道wifi密码(手机连接上wifi怎么知道wifi密码)

关于这个问题,如果您想查看已经连接过的无线网络密码,请按照以下步骤操作:对于Windows10:1.点击任务栏中的WiFi图标,选择“网络和Internet设置”2.在“网络和Internet设...

电脑如何调出任务管理器(电脑如何调出任务管理器快捷键)

在Windows操作系统中,可以通过以下方法调出任务管理器:使用快捷键:按下“Ctrl+Shift+Esc”快捷键组合,即可快速打开任务管理器。使用组合键:按下“Ctrl+Alt+...

win732位怎么还原系统(win732位gho)

系统安装失败,在以前的系统没有备份的情况下,是不能恢复的。只要诺顿开始运行,,不管进度条在什么位置,原系统都被格式化。如果有备份文件,那么方法是:1、打开系统备份还原软件:2、点击浏览,找到备份文件,...

电脑装什么杀毒软件(电脑装什么杀毒软件最安全)

好用的电脑杀毒软件,目前比较知名的有360杀软,腾讯电脑管家,金山毒霸,瑞星等杀毒软件,至于哪一个更好用,就看你自己的习惯了,我个人觉得360比较让人放心一些,这些年也一直用着360,比较安全有保证,...

u盘uefi是什么意思(u盘用uefi模式启动)

u盘启动盘是指在U盘里安装PE版的操作系统后,把系统设置成从U盘启动,然后电脑开机就从U盘开始重装系统。UEFI,全称“统一的可扩展固件接口”,是一种详细描述类型接口的标准。这种接口用于操作系统自动...

qq更新版本下载安装(qq号下载安装2020最新版)
  • qq更新版本下载安装(qq号下载安装2020最新版)
  • qq更新版本下载安装(qq号下载安装2020最新版)
  • qq更新版本下载安装(qq号下载安装2020最新版)
  • qq更新版本下载安装(qq号下载安装2020最新版)
win10系统故障修复工具(win10系统的故障修复界面)
  • win10系统故障修复工具(win10系统的故障修复界面)
  • win10系统故障修复工具(win10系统的故障修复界面)
  • win10系统故障修复工具(win10系统的故障修复界面)
  • win10系统故障修复工具(win10系统的故障修复界面)
天猫积分兑换根本抢不到(2021天猫积分兑换根本抢不到)

因为天猫积分的东西是有限的,但是很多人想要它们。如果你想抢到它,你最好注意启动秒杀的时间,在你启动倒计时时做好准备,并立即点击交换验证码,然后点击确认。一般最慢的时间是十秒内甚至四五秒内下单,五分钟内...

win10任务管理器未响应(win10任务管理器没反应)

未响应这种情况应该是:1、说明程序是正在运行,但由于是系统运行内存不足,或者病毒、垃圾等造成的系统卡顿了。2、可以尝试重启系统、杀毒、清理垃圾即可。解决方法一:双击“此电脑”我的电脑的时候,出现资源管...

新电脑装win7进不了系统(新电脑安装win7系统启动不了)
新电脑装win7进不了系统(新电脑安装win7系统启动不了)

解决方法:1、开机按F8,选择“最好一次正确配置”尝试修复。2、开机按F8,选择“安全模式”尝试修复。3、如果方法1,2不能修复,通过系统还原或者重新安装系统修复。二、如果软件无法修复,仍然无法启动,那么就是硬件故障原因造成的。比如硬盘、主...

2025-12-25 21:55 liuian

台式键盘锁住了打不了字怎么解锁
台式键盘锁住了打不了字怎么解锁

1.找到在键盘上靠左侧的位置,有一个fn的键,按住fn键。2.然后找到键盘最上面f8的键,把fn和f8一起按住,即可完成操作。3.然后此时看到键盘已经解除锁定,就可以可以正常输入了,这样就完成了键盘的解锁操作。...

2025-12-25 21:05 liuian

怎么超频显卡(显卡怎么超频使用)

显卡超频犯法如下:1、首先是显卡体质的检测,如果不知道显卡的体质,盲目加电压或者频率很容易导致超频的失败,检测显卡体质需要用到软件超频和拷机软件。2、接下来是BIOS准备阶段,用户可以选择从现有显卡提...

自动关机怎么设置win10指令(win10设置自动关机代码)

1最简单的方法是通过系统自带的计划任务来设置自动开关机。2打开‘任务计划程序’,选择‘创建基本任务’,按照提示完成设置,可以选择定时执行或在特定条件下执行。3另外也可以通过第三方软件来实现自动开...