关于函数退出协程是否结束的问题
来源:11-1 channel

qq_时光衬人_1
2020-07-05
在这个函数中启动了子协程并返回channel,函数已经返回
func createWorker(id int) chan int {
ch := make(chan int)
go func() {
for {
fmt.Printf("%d 个 work 接受 %c\n", id, <-ch)
}
}()
return ch
}
函数执行结束返回后,才开始向返回的channel进行写入,那之前已经执行完毕的函数中开启的子协程还在工作.
这是不是说明子协程的结束和函数结束没有必然关系?或者说子协程的作用域不在函数内部?谢谢老师
写回答
1回答
-
在运行到go func这行的时候,子协程已经开始工作了。createWorker如果不返回,而是和ch进行交互,也是可以的。
我们其实也没有子协程的叫法,它们的地位是同等的。
函数返回子协程不会返回,会一直存在,直到子协程自己return。这个例子里有一个无条件for,所以子协程不会返回。如果我们中间会break这个for,那么break以后子协程就结束了。
作用域的问题,不是协程的问题,是第七章函数闭包的问题,可以回看一下。我们这个ch是子协程的“自由变量”。ch的生命周期本来跟着createWorker走,但是由于写了个匿名函数,它的生命周期就被绑在者两个函数上面,等到两个函数都退出,ch才会被回收。同样自由变量还有id
112020-07-07
相似问题