关于函数退出协程是否结束的问题

来源: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回答

ccmouse

2020-07-07

在运行到go func这行的时候,子协程已经开始工作了。createWorker如果不返回,而是和ch进行交互,也是可以的。

我们其实也没有子协程的叫法,它们的地位是同等的。

函数返回子协程不会返回,会一直存在,直到子协程自己return。这个例子里有一个无条件for,所以子协程不会返回。如果我们中间会break这个for,那么break以后子协程就结束了。

作用域的问题,不是协程的问题,是第七章函数闭包的问题,可以回看一下。我们这个ch是子协程的“自由变量”。ch的生命周期本来跟着createWorker走,但是由于写了个匿名函数,它的生命周期就被绑在者两个函数上面,等到两个函数都退出,ch才会被回收。同样自由变量还有id

1
1
qq_时光衬人_1
非常感谢!
2020-07-07
共1条回复

Google资深工程师深度讲解Go语言 由浅入深掌握Go语言

语法+分布式爬虫实战 为转型工程师量身打造

5995 学习 · 1909 问题

查看课程