Goroutine
目录
Goroutine 是Go语言中的一个特色,它是在代码层级实现并发的根基。我们举个简单的例子, 首先我们看如何打印0-9,如果没有并发,我们是这样写:
package main
import (
"fmt"
)
func main() {
for i := 0; i < 10; i++ {
fmt.Println(i)
}
}
这样的输出效果一定是从0-9,每个数字一行的,因为这里不是并发执行,而是顺序执行,即for循环,从0,然后到1,然后一直到9。
而借助Goroutine我们可以这样并发打印0-9:
package main
import (
"fmt"
"time"
)
func main() {
for i := 0; i < 10; i++ {
go fmt.Println(i)
}
time.Sleep(time.Second * time.Duration(1))
}
只需要简单的通过 go
这个关键字,就可以实现10个Goroutine一起执行,为什么我们这里要加 time.Sleep
呢?因为Goroutine里,
main函数所在的Goroutine叫做 main goroutine
,如果这个主Goroutine退出了,那么整个Go程序就会跟着一起退出,为了把上面的代码
执行完,我们需要等待一小会儿,可以看看输出:
$ go run main.go
0
8
9
6
2
1
3
4
5
7
看到了吗,他们的输出顺序是不一定的,每一次执行,他们的输出结果都不会一样。
注意,
go
关键字后只能接一个函数,可以是有名字的函数,也可以是匿名函数。注意,Go语言的函数是支持闭包的,也就是说,函数里的函数,内层的函数是可以使用外层函数的变量的。
扩展阅读:如果对协程(coroutine)有兴趣的话,可以阅读 协程(coroutine)简介 - 什么是协程?
更多文章
本站热门
- socks5 协议详解
- zerotier简明教程
- 搞定面试中的系统设计题
- 用peewee代替SQLAlchemy
- frp 源码阅读与分析(一):流程和概念
- Golang(Go语言)中实现典型的fork调用
- DNSCrypt简明教程
- 一个Gunicorn worker数量引发的血案
- Golang validator使用教程
- Docker组件介绍(一):runc和containerd
- Docker组件介绍(二):shim, docker-init和docker-proxy
- 使用Go语言实现一个异步任务框架
- 协程(coroutine)简介 - 什么是协程?
- SQLAlchemy简明教程
- Go Module 简明教程