作者回复: 我也希望尽量这样。主要是后面的课程内容相对前面的每一课都多不少,为满足平台对时长的限制,只能将一些代码事先准备好。也建议可以下载我们github上的代码在机器上运行和调试。谢谢
作者回复: 你运行的是下面代码,由于协程的调度是随机的,所以第一个返回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())
}
作者回复: 在检查协程数之前sleep一秒试试,让协程有时间完成和释放
作者回复: 是的。只是第一个结果回来就返回接在做下面的事了