dongzangchui2072 2019-06-22 09:13
浏览 3

安排多个goroutine

package main

import "fmt"


func square(c chan int) {
    fmt.Println("[square] reading (4)")
    num := <-c
    fmt.Println("[square] calc (5)")
    c <- num * num
    fmt.Println("back from [square] (10)")
}

func cube(c chan int) {
    fmt.Println("[cube] reading (3)")
    num := <-c
    fmt.Println("[cube] calc (11)")
    c <- num * num * num
    fmt.Println("back from [cube] (12)")
}

func main() {
    fmt.Println("[main] main() started (1)")

    squareChan := make(chan int)
    cubeChan := make(chan int)

    go square(squareChan)
    go cube(cubeChan)

    testNum := 3
    fmt.Println("[main] sent testNum to squareChan (2)")

    squareChan <- testNum

    fmt.Println("[main] resuming (6)")
    fmt.Println("[main] sent testNum to cubeChan (7)")

    cubeChan <- testNum // why doesn't block here?

    fmt.Println("[main] resuming (8)")
    fmt.Println("[main] reading from channels (9)")

    squareVal, cubeVal := <-squareChan, <-cubeChan
    fmt.Println("[main] waiting calculating (13)")

    fmt.Println("[main] results: ", squareVal, cubeVal)
    fmt.Println("[main] main() stopped")
}

output:

[main] main() started (1)
[main] sent testNum to squareChan (2)
[cube] reading (3)
[square] reading (4)
[square] calc (5)
[main] resuming (6)
[main] sent testNum to cubeChan (7)
[main] resuming (8)
[main] reading from channels (9)
back from [square] (10)
[cube] calc (11)
back from [cube] (12)
[main] waiting calculating (13)
[main] results:  9 27
[main] main() stopped

In the code given above, I think the main() routine should be blocked after cubeChan <- testNum, then cube routine should be scheduled, which means the output [cube] calc (11) ought to be prior to [main] resuming (8). But after executing on Playground, I'm so confused by the output.

Could anyone tell me if I misunderstand anything?

  • 写回答

2条回答 默认 最新

  • doudouwd2017 2019-06-22 14:18
    关注

    I think the main() routine should be blocked after cubeChan <- testNum

    it does block, but at these:

    squareVal, cubeVal := <-squareChan, <-cubeChan
                          ^             ^
    

    if either squareChan or cubeChan doesn't receive any values in other routines, that line will become deadlock, modify cube() like below to see the effect:

    func cube(c chan int) {
        fmt.Println("[cube] reading (3)")
        _ = <-c
        fmt.Println("[cube] calc (11)")
        // c <- num * num * num
        fmt.Println("back from [cube] (12)")
    }
    
    评论

报告相同问题?

悬赏问题

  • ¥15 使用ue5插件narrative时如何切换关卡也保存叙事任务记录
  • ¥20 软件测试决策法疑问求解答
  • ¥15 win11 23H2删除推荐的项目,支持注册表等
  • ¥15 matlab 用yalmip搭建模型,cplex求解,线性化处理的方法
  • ¥15 qt6.6.3 基于百度云的语音识别 不会改
  • ¥15 关于#目标检测#的问题:大概就是类似后台自动检测某下架商品的库存,在他监测到该商品上架并且可以购买的瞬间点击立即购买下单
  • ¥15 神经网络怎么把隐含层变量融合到损失函数中?
  • ¥15 lingo18勾选global solver求解使用的算法
  • ¥15 全部备份安卓app数据包括密码,可以复制到另一手机上运行
  • ¥20 测距传感器数据手册i2c