作者回复: 这个是因为counter不是线程安全的,要用sync.Mutex的lock来同步,参考视频
作者回复: 非常感谢!
作者回复: 是那个par的值,作为参数传人
作者回复: 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)
}
}
作者回复: 这里不是很方便输入很多文字。推荐可以看看这两篇
https://m.imooc.com/mip/article/42071
https://studygolang.com/articles/11862?open_source=weibo_search