原问题请见 https://studygolang.com/topics/4319
一直没人解答,看有没有大神能够解释一下?
简单说就是这样一个场景,比如设置逻辑处理器数量为 1 个,开启多个 go 协程,假设 G1,G2,G3,G4,G5,运行时的顺序为什么始终是先执行最后一个 G5,再执行 G1,G2,G3,G4?
代码和运行示例:
https://play.golang.org/p/zn0GrzVsUwV
<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("Create Goroutines")
myCreatTask()
fmt.Println("Waiting To Finish")
wg.Wait()
fmt.Println("Terminating Program")
}
func myCreatTask() {
y = 1
defer tick(time.Now().UTC())
for i:=0 ; i < 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 < 257(标记为n,下文n就是这个),即当前有一个任务,队列有256个任务时,
打印符合你所说的,256,0-255。
当n大于257的时候,应该重新分配了新的队列。所以顺序被打乱了,接着在新队列的某个位置开始加新的任务。
原先的任务被随机分成A和B两堆任务,接着在A后面开始加新的任务。
*以上是运行上述代码得出来的结论,非源码性结论,希望给你一点头绪。如果知道原理,望告知。
#1