Skip to content
On this page

协程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函数之后
}