Golang中国

package main

import "fmt"

func main() {

ch := make(chan int)

go func() { ch <- 1 }()

go func() { ch <- 2 }()

go func() { ch <- 3 }()

x, y, z := <-ch, <-ch, <-ch

fmt.Println(x, y, z)

}

打印结果 为什么不是 1 2 3 而是 3 1 2 呢? 此前还真没注意到这问题。


gomgo 于 2016-11-19 20:09 修改
10 回复
gomgo
#1 gomgo • 2016-11-19 20:16
package main

import "fmt"

func main() {

ch := make(chan int)

go func() { ch <- 1 }()

go func() { ch <- 2 }()

go func() { ch <- 3 }()

x, y := <-ch, <-ch

fmt.Println(x, y)

}

打印结果是 3 1 , 请问 2 哪里去了?

zmguozi
#2 zmguozi • 2016-11-19 21:24

因为2没来得及执行,就退出了。

jthmath
#3 jthmath • 2016-11-19 21:26

routine 的执行顺序没准儿

gomgo
#4 gomgo • 2016-11-19 21:40

@zmguozi : 2 好像是执行了

package main

import "fmt"

func main() {

ch := make(chan int)

go func() { ch <- 1 }()

go func() { ch <- 2 }()

go func() { ch <- 3 }()

x, y := <-ch, <-ch

fmt.Println(x, y)

z := <-ch

fmt.Println(z)
}

输出
3 1
2

gomgo
#5 gomgo • 2016-11-19 21:43

@jthmath : 执行好像很有顺序,总是输出 6 1 2 3 4 5

package main

import "fmt"

func main() {

ch := make(chan int)

go func() { ch <- 1 }()

go func() { ch <- 2 }()

go func() { ch <- 3 }()

go func() { ch <- 4 }()

go func() { ch <- 5 }()

go func() { ch <- 6 }()

u, v, w, x, y, z := <-ch, <-ch, <-ch, <-ch, <-ch, <-ch

fmt.Println(u, v, w, x, y, z)

}
zmguozi
#6 zmguozi • 2016-11-19 21:49

单核有顺序,多核没随机。

gomgo
#7 gomgo • 2016-11-19 22:08

@zmguozi : 多核是下面这样的么? 哦,明白了些! 耗费了时间啊,没真正明白一个知识点

package main

import (
"fmt"
"runtime"
)

func main() {
var MULTICORE int = runtime.NumCPU() //number of core
fmt.Println(MULTICORE)               // 4
runtime.GOMAXPROCS(MULTICORE)        //running in multicore

ch := make(chan int)

go func() { ch <- 1 }()
go func() { ch <- 2 }()
go func() { ch <- 3 }()
go func() { ch <- 4 }()
go func() { ch <- 5 }()
go func() { ch <- 6 }()

x, y, z := <-ch, <-ch, <-ch
fmt.Println(x, y, z)

u, v, w := <-ch, <-ch, <-ch
fmt.Println(u, v, w)

}
gomgo
#8 gomgo • 2016-11-19 22:19
package main

import (
"fmt"
"runtime"
)

func main() {
var MULTICORE int = runtime.NumCPU()
fmt.Println(MULTICORE) // 4
runtime.GOMAXPROCS(MULTICORE)

ch := make(chan int)

go func() { ch <- 1 }()
go func() { ch <- 2 }()
go func() { ch <- 3 }()
go func() { ch <- 4 }()
go func() { ch <- 5 }()
go func() { ch <- 6 }()

u, v, w, x, y, z := <-ch, <-ch, <-ch, <-ch, <-ch, <-ch
fmt.Println(u, v, w, x, y, z)

}

好像即使多核情况下,顺序还是不变啊???
多次执行仍然固定顺序输出: 6 1 2 3 4 5

gomgo
#9 gomgo • 2016-11-19 22:37

反复比较,加上for 循环,单核与多核 time.Sleep(1 * time.Second)

总算有点明白了

总是用框架,还是有弊端的啊

joeonly
#10 joeonly • 2016-11-19 23:15

感觉楼主对线程和协程还没有基本的认识,建议还是先看些书理解下时间成本会低些。网上讨论效率低很多。

需要 登录 后方可回复, 如果你还没有账号你可以 注册 一个帐号。