V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
hwdef
V2EX  ›  问与答

让 go 堵塞方式的疑问

  •  
  •   hwdef · 2021-03-09 11:25:30 +08:00 · 1344 次点击
    这是一个创建于 1359 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我想让一个 go 函数永远挺住,目前想到三种方法

    for{}
    
    select{}
    
    done := make(chan bool)
    <-done
    

    这三种方式有什么区别吗?在 cpu 和内存的使用上呢?

    第 1 条附言  ·  2021-03-09 13:44:28 +08:00
    刚才在测试的过程中,又发现一个问题。。

    一个函数

    ```go
    func demo() bool {

    }
    ```

    如果用 chan 去堵塞,就需要写 return,否则会报错

    ```go
    func demo() bool {
    done := make(chan bool)
    <-done
    return true
    }
    ```

    如果用 select{}去堵塞,不写 return 也不会报错,有人知道这是为什么吗?

    ```go
    func demo() bool {
    select {}
    }
    ```
    11 条回复    2021-03-09 15:07:24 +08:00
    emSaVya
        1
    emSaVya  
       2021-03-09 11:29:38 +08:00   ❤️ 2
    2 3 会 yield 1 不会
    bianzhifu
        2
    bianzhifu  
       2021-03-09 13:30:02 +08:00   ❤️ 1
    优先使用 2 简单,代码最少,其次是 3,如果使用 1,可以在 for 里面写一个 time.Sleep(time.Hour)
    hwdef
        3
    hwdef  
    OP
       2021-03-09 13:31:06 +08:00
    @bianzhifu 这三个在性能上差别大吗
    hwdef
        4
    hwdef  
    OP
       2021-03-09 13:32:25 +08:00
    @bianzhifu 为什么 3 里面要放一个 sleep 呢
    ToPoGE
        5
    ToPoGE  
       2021-03-09 13:34:13 +08:00 via Android   ❤️ 1
    @hwdef for 肯定是不能用的
    baiyi
        6
    baiyi  
       2021-03-09 14:22:07 +08:00   ❤️ 1
    @hwdef #4 通道阻塞没有人唤醒是不会重新运行的,for 被抢占后还是会被切换回来的。select 有 case 才需要 return,没有 case 会阻塞,所以不用 return,编译器的优化
    hwdef
        7
    hwdef  
    OP
       2021-03-09 14:27:21 +08:00
    @baiyi 大概了解了,感谢。那我还是用 select 吧,没有唤醒的需求。
    boboliu
        8
    boboliu  
       2021-03-09 14:51:59 +08:00 via Android   ❤️ 1
    直接这样写 for 死循环会在 gc 时会因为 for 所在 goroutine 无法被 gc 给抢占,从而卡死整个应用

    如果你的 for 内有 call 一些大函数或者用 time.Sleep 的话可以避开这个问题,但是仍然要小心防止无意中写错,所以不如用 chan 或者 sync 包
    sunny352787
        9
    sunny352787  
       2021-03-09 14:58:25 +08:00
    你该不会是在 main 里面停不下来吧?
    hwdef
        10
    hwdef  
    OP
       2021-03-09 15:07:10 +08:00
    @boboliu 明白了,感谢
    hwdef
        11
    hwdef  
    OP
       2021-03-09 15:07:24 +08:00
    @sunny352787 不是 main,一个监听文件变动的函数。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1132 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 779ms · UTC 19:03 · PVG 03:03 · LAX 11:03 · JFK 14:03
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.