首页 > 其他分享 >Go 语言系列24:go 协程

Go 语言系列24:go 协程

时间:2022-11-25 13:39:25浏览次数:38  
标签:24 协程 函数 Go time go main

Go 协程 是与其他函数或方法一起并发运行的函数或方法。Go 协程可以看作是轻量级线程。与线程相比,创建一个 Go 协程的成本很小。因此在 Go 应用中,常常会看到有数以千计的 Go 协程并发地运行。


Go 语言系列24:go 协程_参考文献

启动一个 go 协程

Go 语言系列24:go 协程_主函数_02


调用函数或者方法时,如果在前面加上关键字 ​​go​​ ,就可以让一个新的 Go 协程并发地运行。

// 定义一个函数
func function_name() {
code
}

// 执行一个函数
function_name()

// 开启一个协程执行这个函数
go function_name()

下面是启动一个协程的例子, ​​go PrintfA()​​​ 语句启动了一个新的协程, ​​PrintfA()​​​ 函数与 ​​main()​​ 函数会并发执行,主函数运行在一个特殊的协程上,这个协程称之为 主协程(Main Goroutine)

启动一个新的协程时,协程的调用会立即返回。与函数不同,程序控制不会去等待 Go 协程执行完毕。在调用 Go 协程之后,程序控制会立即返回到代码的下一行,忽略该协程的任何返回值。如果 Go 主协程终止,则程序终止,于是其他 Go 协程也不会继续运行。为了让新的协程能继续运行,我们在 ​​main()​​​ 函数添加了 ​​time.Sleep(1 * time.Second)​​ 使主协程休眠 1 秒,但这种做法并不推荐,这里只是为了演示而添加。

package main

import (
"fmt"
"time"
)

func PrintfA() {
fmt.Println("A")
}

func main() {
// 开启一个协程执行 PrintfA 函数
go PrintfA()
// 使主协程休眠 1 秒
time.Sleep(1 * time.Second)
// 打印 main
fmt.Println("main")
}

运行上面的程序输出如下:

A
main

Go 语言系列24:go 协程_参考文献

启动多个 go 协程

Go 语言系列24:go 协程_主函数_02


通过下面的例子,可以观察到两个协程就如两个线程一样,并发执行:

package main

import (
"fmt"
"time"
)

func Print(num int) {
for i := 0; i < 5; i++ {
fmt.Println(num)
// 避免观察不到并发效果 加个休眠
time.Sleep(time.Millisecond)
}
}

func main() {
// 开启 1 号协程
go Print(1)
// 开启 2 号协程
go Print(2)
// 使主协程休眠 1 秒
time.Sleep(time.Second)
}

运行该程序的一种输出如下:

2
1
1
2
2
1
1
2
2
1

参考文献:

[1] Alan A. A. Donovan; Brian W. Kernighan, Go 程序设计语言, Translated by 李道兵, 高博, 庞向才, 金鑫鑫 and 林齐斌, 机械工业出版社, 2017.



标签:24,协程,函数,Go,time,go,main
From: https://blog.51cto.com/u_15891283/5886555

相关文章

  • Go 语言系列21:goto 无条件跳转
    在Go语言中保留​​goto​​​这点我确实没想到,毕竟很多人不建议使用​​goto​​​语句。​​goto​​后面接的是标签,表示下一步要执行哪里的代码。gotolabel...la......
  • LeetCode 240.搜索二维矩阵II(中等)
    题目描述:编写一个高效的算法来搜索 ​​m x n​​​ 矩阵​​matrix​​​中的一个目标值​​target​​。该矩阵具有以下特性:每行的元素从左到右升序排列。每列的......
  • one preparation of algorithms in short text clustering
    文本聚类算法文本聚类一般步骤文本表示(TextRepresentation)把文档表示成聚类算法可以处理的形式。聚类算法选择或设计(ClusteringAlgorithms)算法的选择,往往伴随着相......
  • Go语言错误总结(三)
    15、Strings无法修改尝试使用索引操作来更新字符串变量中的单个字符将会失败。string是只读的byteslice(和一些额外的属性)。如果你确实需要更新一个字符串,那么使用byteslic......
  • Go语言错误总结(二)
    8、使用“nil”SlicesandMaps在一个nil的slice中添加元素是没问题的,但对一个map做同样的事将会生成一个运行时的panic。正确代码:packagemainfuncmain(){vars[]i......
  • Go语言错误总结(五)
    29、未导出的结构体不会被编码以小写字母开头的结构体将不会被(json、xml、gob等)编码,因此当你编码这些未导出的结构体时,你将会得到零值。packagemainimport("encoding/......
  • Go语言错误总结(四)
    22、内建的数据结构操作不是同步的即使Go本身有很多特性来支持并发,并发安全的数据集合并不是其中之一,确保数据集合以原子的方式更新是你的职责。Goroutines和channels是实现......
  • Go 操作 MySQL 数据库
    这一期讲一讲如何使用Go操作MySQL数据库,这里就不讲MySQL的安装以及配置了,但要记得开启MySQL服务,我这里使用的是MySQL8.0.20版本。加载数据库驱动想要连接到数据......
  • Go 的 MySQL 预处理、MySQL 事务
    预处理是什么在普通SQL语句执行过程中,客户端会对SQL语句进行占位符替换,从而得到要执行的完整SQL语句,客户端再将此SQL语句发送到服务端执行,服务端最后把结果返回给客......
  • go实现投票并实时打印投票信息
    packagemainimport"fmt"varstudents[]Studentvarflagbool=truetypeStudentstruct{noint//候选人编号namestring//候选热姓名countint//得票数}fun......