Golang 在一个逻辑处理器下的协程调度顺序是怎样的?

nfwater · · 1031 次点击
<a href="/user/nfwater" title="@nfwater">@nfwater</a> 我做了下实验,觉得整个机制应该是,最新的任务不放在队列直接执行,前面的任务会在队列中再取出执行 初始队列的长度是256,你如果申请了257个任务,第257个任务会先执行,接着执行第1到256. 如果超过256,那么会把队列加长,原先的顺序会被打乱。接着会在队列的某一个位置开始添加新的任务。 代码如下, ```go var wg sync.WaitGroup var y int func main() { runtime.GOMAXPROCS(1) fmt.Println(&#34;Create Goroutines&#34;) myCreatTask() fmt.Println(&#34;Waiting To Finish&#34;) wg.Wait() fmt.Println(&#34;Terminating Program&#34;) } func myCreatTask() { y = 1 defer tick(time.Now().UTC()) for i:=0 ; i &lt; 257; i++{ if (y == 0) { return } wg.Add(1) go myprint(i) } } func tick(tick time.Time) { fmt.Println(time.Now().UTC().Sub(tick)) } func myprint(n int) { y = 0 defer wg.Done() fmt.Println(n) } ``` 当for循环的结束条件为 i &lt; 257(标记为n,下文n就是这个),即当前有一个任务,队列有256个任务时, 打印符合你所说的,256,0-255。 当n大于257的时候,应该重新分配了新的队列。所以顺序被打乱了,接着在新队列的某个位置开始加新的任务。 原先的任务被随机分成A和B两堆任务,接着在A后面开始加新的任务。 *以上是运行上述代码得出来的结论,非源码性结论,希望给你一点头绪。如果知道原理,望告知。
#1
更多评论
好像是说最后一个任务会放到一个特殊的地方先执行,具体原理不深究了。对实际开发似乎也没太大意义。
#2