go协程
基本使用
Go 协程是与其他函数或方法一起并发运行的函数或方法。Go 协程可以看作是轻量级线程。与线程相比,创建一个 Go 协程的成本很小。因此在 Go 应用中,常常会看到有数以千计的 Go 协程并发地运行。
ex 1:
package main import "fmt" func hello () { fmt.Println("hello goroutine") } func main () { go hello() fmt.Println("main func") }
上面的程序会返回以下两个结果,造成差异的主要原因是协程调用后会立即返回,不会等待协程执行完毕,而主程序执行完毕后,协程也会被终止,因此只有在主程序终止前,协程的返回才有效。
re 1:
main func
或者
main func
hello goroutine
- 启动一个新的协程时,协程的调用会立即返回。与函数不同,程序控制不会去等待 Go 协程执行完毕。在调用 Go 协程之后,程序控制会立即返回到代码的下一行,忽略该协程的任何返回值。
- 如果希望运行其他 Go 协程,Go 主协程必须继续运行着。如果 Go 主协程终止,则程序终止,于是其他 Go 协程也不会继续运行。
基于以上两点,我们可以在调用协程后再调用time包里面的Sleep函数,休眠一段时间后再继续执行主程序,这样主程序便可以在携程执行完毕后再执行。
加入休眠
ex 2:
func main () { go hello() time.Sleep(1 * time.Second) fmt.Println("main func") }
主程序等待协程执行完毕再执行
res 2:
hello goroutine
main func
启动多个协程
ex 3:
package main import ( "fmt" "time" ) func numbers () { for i := 1; i < 6; i++ { time.Sleep(150 * time.Millisecond) fmt.Printf("%d ", i) } } func letters () { for i := 'a'; i <= 'e'; i++ { time.Sleep(300 * time.Millisecond) fmt.Printf("%c ", i) } } func main () { go numbers() go letters() time.Sleep(3 * time.Second) fmt.Println("main") }
res 3:
1 2 a 3 b 4 5 c d e main
执行步骤如下图所示: