作者回复: 非常感谢!
作者回复: 这个是因为counter不是线程安全的,要用sync.Mutex的lock来同步,参考视频
作者回复: go的协程本质是系统的线程调用,而Python中的协程是eventloop模型实现,所以虽然都叫协程,但并不是一个东西
作者回复: Goroutine的调度是这样的 启动的时候,会专门创建一个线程sysmon,用来监控和管理,在内部是一个循环: 1. 记录所有P的G任务计数schedtick,(schedtick会在每执行一个G任务后递增) 2. 如果检查到 schedtick一直没有递增,说明这个P一直在执行同一个G任务,如果超过一定的时间,就在这个G任务的栈信息里面加一个标记 3. 然后这个G任务在执行的时候,如果遇到非内联函数调用,就会检查一次这个标记,然后中断自己,把自己加到队列末尾,执行下一个G 你可以试试下面这个程序,多运行一会,你就会看到切换 func doSomething(i int) { fmt.Print(i) } func main() { runtime.GOMAXPROCS(1) go func() { for { doSomething(0) } }() for { doSomething(1) } }
作者回复: 代码需要改成下面这样,原因我在讲座中有介绍 func TestConoutines(t *testing.T) { for i:=1;i<10;i++ { go func(j int) { fmt.Println(j) }(i) } }
作者回复: 对的是逻辑上,可以通过GOMAXPROCS定义
作者回复: 这里不是很方便输入很多文字。推荐可以看看这两篇 https://m.imooc.com/mip/article/42071 https://studygolang.com/articles/11862?open_source=weibo_search
作者回复: 哈哈,技术人通病
作者回复: 你可以调整一下sleep的时间试试
作者回复: 是那个par的值,作为参数传人