协程嵌套使用注意事项

package main

import (
   "fmt"
   "time"
)

func main() {
   go func() {
      fmt.Println("1、父协程 -> 开始")

      go func() {
         fmt.Println("3、子协程 -> 开始")
         time.Sleep(time.Second * 3)
         fmt.Println("4、子协程 -> 完成")
      }()

      fmt.Println("2、父协程 -> 完成")
   }()

   time.Sleep(time.Second * 5) // 休眠5秒阻止主线程退出
}

//========== 输出过程·开始 ==========//
// 1、父协程 -> 开始
// 2、父协程 -> 完成
// 3、子协程 -> 开始
// 4、子协程 -> 完成
//========== 输出过程·结束 ==========//

//========== 总结 ==========//
// 1、无论协程嵌套多少层,只要主线程退出了,所有协程都会被强制退出。
// 2、在主线程没退出的前提下,父协程执行完并不会中断子协程的执行。



和协程嵌套类似,在函数体内部启动的协程也不会因为函数执行完而被强制退出。

package main

import (
   "fmt"
   "time"
)

func foo() {
   fmt.Println("foo()开始")

   go func() {
      fmt.Println("函数内部的协程开始")

      for i := 1; i <= 5; i++ {
         fmt.Printf("i = %d \n", i)
         time.Sleep(time.Second)
      }

      fmt.Println("函数内部的协程结束")
   }()

   fmt.Println("foo()结束")
}

func main() {
   foo()
   time.Sleep(time.Second * 10)
}

//========== 输出过程·开始 ==========//
// foo()开始
// foo()结束
// 函数内部的协程开始
// i = 1
// i = 2
// i = 3
// i = 4
// i = 5
// 函数内部的协程结束
//========== 输出过程·结束 ==========//

//========== 总结 ==========//
// 1、在主线程没有退出的前提下,函数体内部启动的协程并不会因为函数执行完而退出。

Copyright © 2024 码农人生. All Rights Reserved