作者回复: 第一, goroutine是轻量级线程(G),它被调度到执行器M上执行,而不是cpu上。M会被os调度到cpu上执行。 第二,可运行的G先被放入P的队列,每个P绑定一个可以用于执行G的M。之后调度程序可以从P队列中取出G放在M上执行。一个G执行一定时间后,再从队列中取出另一个G运行。 基于上述描述,你的问题,当main中通过go func启动一个新goroutine后,就会有两个可运行的(runnable)的G,新G会被放入P的队列并等待被调度。至于新G是否会与原先的main G分配到一个P上,不确定。如果机器只有一个cpu core。那么显然就如你所说的,新G与main G轮流被调度执行。如果有多个cpu core,那么新G与main G可能就是并行(paralell)执行的。
作者回复: 1. 对,n,m只是序号。 2.对。通常我们用struct来抽象事物。保护的也是通常也是这种类型数据。
作者回复: 好问题! 我的理解是:那就需要那个慢业务调用本身也支持Context。很多人说context.Context有“传染”效应,大概就是这个意思。
作者回复: 同步与异步的概念应用很广,在很多领域都有应用。比如通信领域,比如并发编程领域。 这一讲的同步设计中的“同步(sync)”指的是并发编程中对临界区进行“互斥”访问的概念,即有且仅有一个goroutine可以进入临界区,操作临界区的数据。其他goroutine只能在临界区外“排队”等待时机进入。 不过无论用在那个领域,“同步”与“异步”的通用含义是: 同步操作:执行流 只有等待发起的同步操作完成后,才能继续向下执行。 异步操作:发起异步操作后,原执行流可以无需等待,即可向下继续执行。
作者回复: 👍
作者回复: 👍
作者回复: ✅👍。
作者回复: 有点这个意思。
作者回复: 👍
作者回复: 👍