作者回复: 我也希望尽量这样。主要是后面的课程内容相对前面的每一课都多不少,为满足平台对时长的限制,只能将一些代码事先准备好。也建议可以下载我们github上的代码在机器上运行和调试。谢谢
作者回复: 谢谢🙏
作者回复: 在检查协程数之前sleep一秒试试,让协程有时间完成和释放
作者回复: 至于使用buffered chan还是使用阻塞chan,重点也要看看你要不要发送者和接收者见同步
作者回复: 是的,那个协程会被阻塞。这就造成了携程泄漏
作者回复: 粘贴一下你的实验代码
作者回复: 判断是否有问题的核心就是是不是有协程被阻塞
作者回复: 是的。还有其他协程。
作者回复: t.Log("Before:", runtime.NumGoroutine()) t.Log(FirstResponse()) time.Sleep(time.Second * 1) t.Log("After:", runtime.NumGoroutine()) 你是不是没有Sleep呢,协程还没有释放回收
作者回复: 你运行的是下面代码,由于协程的调度是随机的,所以第一个返回channel的结果也是随机的,你可以多运行几次看看,可以通过命令行 go test -v 试试。 package concurrency import ( "fmt" "runtime" "testing" "time" ) func runTask(id int) string { time.Sleep(10 * time.Millisecond) return fmt.Sprintf("The result is from %d", id) } func FirstResponse() string { numOfRunner := 10 ch := make(chan string, numOfRunner) for i := 0; i < numOfRunner; i++ { go func(i int) { ret := runTask(i) ch <- ret }(i) } return <-ch } func TestFirstResponse(t *testing.T) { t.Log("Before:", runtime.NumGoroutine()) t.Log(FirstResponse()) time.Sleep(time.Second * 1) t.Log("After:", runtime.NumGoroutine()) }