go语言学习笔记 — 进阶 — 并发编程:为函数创建goroutine
Posted Locutus
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了go语言学习笔记 — 进阶 — 并发编程:为函数创建goroutine相关的知识,希望对你有一定的参考价值。
使用go关键字为一个函数创建一个goroutine。函数与goroutine是一对多的关系,即可以为一个函数创建多个goroutine,一个goroutine必定只对应一个函数。
为普通函数创建goroutine
- 格式
为一个go函数创建goroutine,写法如下:
go 函数名( 参数列表 )
其中,函数名是要调用创建goroutine的funcName;参数列表是函数入参。使用go关键字创建goroutine时,函数的返回值会被忽略。
注:如果想要在goroutine中返回数据,我们需要使用通道channel,把数据从goroutine中作为返回值传出。
- 例子
命令行不断输出tick n,同时可以接收用户输入,两个操作同时进行。
package main
import (
"fmt"
"time"
)
func running() {
var times int
for { // 构建一个无限循环
times++
fmt.Println("tick", times) // 输出times变量的值
time.Sleep(time.Second) // time.Sleep延时1秒,之后继续循环
}
}
func main() {
go running() // 使running()函数和main()函数并发执行
var input string
fmt.Scanln(&input) // 接收用户输入,直到按回车键把命令行输入内容写入input变量
fmt.Println(input) // 输出input内容
}
/*
在go语言中,runtime运行时会默认为main()函数创建一个goroutine。
在本例中,main()函数的goroutine创建运行后,执行到go running()时,go调度系统又为running()函数
函数创建了一个goroutine,running()函数在自己的goroutine中运行。
此时通过go语言的调度机制,程序有两个goroutine同时运行。
*/
为匿名函数创建goroutine
- 格式
使用匿名函数或闭包创建goroutine时,需要定义函数、参数列表、函数列表、入参列表。
go func(参数列表) {
函数体
}(入参列表)
- 例子
在main()函数中创建一个匿名函数,并为匿名函数启动goroutine。
package main
import (
"fmt"
"time"
)
func main() {
go func() { // 使running()函数和main()函数并发执行
var times int
for { // 构建一个无限循环
times++
fmt.Println("tick", times) // 输出times变量的值
time.Sleep(time.Second) // time.Sleep延时1秒,之后继续循环
}
}()
var input string
fmt.Scanln(&input) // 接收用户输入,直到按回车键把命令行输入内容写入input变量
fmt.Println(input) // 输出input内容
}
所有goroutine都会在main()结束时,一同结束。goroutine类似于线程,但从调度性能上没有线程细致。细致程度取决于goroutine调度器的实现和运行环境。终止goroutine的最好方法是自然返回goroutine对应的函数。虽然可以用 golang.org/x/net/context 包进行goroutine生命周期控制,但此法处于内测阶段。现在还没有办法获取goroutine的ID。
以上是关于go语言学习笔记 — 进阶 — 并发编程:为函数创建goroutine的主要内容,如果未能解决你的问题,请参考以下文章
go语言学习笔记 — 进阶 — 并发编程:通道(channel) —— 在多个goroutine之间通信的管道
go语言学习笔记 — 进阶 — 并发编程:通道(channel)—— 使用channel收发数据
go语言学习笔记 — 进阶 — 并发编程:go语言的协程goroutine,与普通程序的协程coroutine
go语言学习笔记 — 进阶 — 并发编程:轻量级线程goroutine —— 并发与并行