协程Groutine
Go
语言的协程(Groutine)
是与其他函数或方法一起并发运行
的工作方式协程
可以看作是轻量级线程
,与线程
相比,创建一个协程的成本很小
,因此在Go
应用中,常常会看到会有很多协程并发地运行
启动一个协程
- 调用
函数
或者方法
时,如果在前面加上关键字go
,就可以让一个新的Go协程
并发地运行
Go
// 定义一个函数
func func_name(arguments) return_value {
...
}
// 执行一个函数
func_name(arguments)
// 开启一个协程执行这个函数
go func_name(arguments)
示例
Go
func printText() {
fmt.Println("hello world")
}
func main() {
// 开启一个协程执行 printText 函数
go printText()
// 使主协程休眠 1 秒
time.Sleep(time.Second * 1)
fmt.Println("printText函数之后")
}
主函数(main)
运行在一个特殊的协程
上,这个协程称之为主协程(Main Goroutine)
启动一个新的协程时,协程的调用会
立即返回
程序控制不会去等待
协程执行完毕
,在调用Go协程
之后,程序控制会立即返回到代码的下一行
,忽略该协程的任何返回值。如Go主协程终止
,则程序终止
,于是其他Go协程也会终止
为了让新的协程能继续运行,我们在
main
函数添加了time.Sleep(time.Second * 1)
,使主协程休眠1秒
,但这种做法并不推荐
启动多个协程
Go
func loopPrint(num int) {
for i := 0; i < 2; i++ {
fmt.Println(num)
time.Sleep(time.Millisecond)
}
}
func main() {
// 开启一号协程
go loopPrint(2)
// 开启二号协程
go loopPrint(6)
// 主协程休眠一秒
time.Sleep(time.Second)
fmt.Println("loopPrint函数之后")
//打印如下
// 2
// 6
// 6
// 2
// loopPrint函数之后
}