考慮來自http://www.golang-book.com/10/index.htm#section2 的乒乓球示例。package mainimport ( "fmt" "time")func pinger(c chan string) { for i := 0; ; i++ { c <- "ping" }}func ponger(c chan string) { for i := 0; ; i++ { c <- "pong" }}func printer(c chan string) { for { msg := <- c fmt.Println(msg) time.Sleep(time.Second * 1) }}func main() { var c chan string = make(chan string) go pinger(c) go ponger(c) go printer(c) var input string fmt.Scanln(&input)}作者寫道:“該程序現(xiàn)在將輪流打印乒乓?!比欢獙?shí)現(xiàn)這一點(diǎn),Go 必須決定發(fā)送者可以發(fā)送到通道的順序?否則,將無法保證 ping 會在 pong 之前發(fā)送(即您無法獲得兩次 ping 或連續(xù)兩次 pong)。這是如何運(yùn)作的?
2 回答

神不在的星期二
TA貢獻(xiàn)1963條經(jīng)驗(yàn) 獲得超6個贊
ping和ponggoroutine之間沒有同步,因此不能保證響應(yīng)會按順序打印。
如果你強(qiáng)制 goroutines 以 GOMAXPROCS>1 競爭,你會得到隨機(jī)輸出:
pong
ping
ping
pong
ping
pong
ping
pong
pong
這甚至不是“乒乓”的例子,因?yàn)闆]有呼叫和響應(yīng)。

慕田峪4524236
TA貢獻(xiàn)1875條經(jīng)驗(yàn) 獲得超5個贊
- 2 回答
- 0 關(guān)注
- 265 瀏覽
添加回答
舉報
0/150
提交
取消