跳至主要內容
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?

4563博客

全新的繁體中文 WordPress 網站
  • 首頁
  • 让 go 堵塞方式的疑问
未分類
11 3 月 2021

让 go 堵塞方式的疑问

让 go 堵塞方式的疑问

資深大佬 : hwdef 0

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

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

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

大佬有話說 (11)

  • 資深大佬 : emSaVya

    2 3 会 yield 1 不会

  • 資深大佬 : bianzhifu

    优先使用 2 简单,代码最少,其次是 3,如果使用 1,可以在 for 里面写一个 time.Sleep(time.Hour)

  • 主 資深大佬 : hwdef

    @bianzhifu 这三个在性能上差别大吗

  • 主 資深大佬 : hwdef

    @bianzhifu 为什么 3 里面要放一个 sleep 呢

  • 資深大佬 : ToPoGE

    @hwdef for 肯定是不能用的

  • 資深大佬 : baiyi

    @hwdef #4 通道阻塞没有人唤醒是不会重新运行的,for 被抢占后还是会被切换回来的。select 有 case 才需要 return,没有 case 会阻塞,所以不用 return,编译器的优化

  • 主 資深大佬 : hwdef

    @baiyi 大概了解了,感谢。那我还是用 select 吧,没有唤醒的需求。

  • 資深大佬 : boboliu

    直接这样写 for 死循环会在 gc 时会因为 for 所在 goroutine 无法被 gc 给抢占,从而卡死整个应用

    如果你的 for 内有 call 一些大函数或者用 time.Sleep 的话可以避开这个问题,但是仍然要小心防止无意中写错,所以不如用 chan 或者 sync 包

  • 資深大佬 : sunny352787

    你该不会是在 main 里面停不下来吧?

  • 主 資深大佬 : hwdef

    @boboliu 明白了,感谢

  • 主 資深大佬 : hwdef

    @sunny352787 不是 main,一个监听文件变动的函数。

文章導覽

上一篇文章
下一篇文章

AD

其他操作

  • 登入
  • 訂閱網站內容的資訊提供
  • 訂閱留言的資訊提供
  • WordPress.org 台灣繁體中文

51la

4563博客

全新的繁體中文 WordPress 網站
返回頂端
本站採用 WordPress 建置 | 佈景主題採用 GretaThemes 所設計的 Memory
4563博客
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?
在這裡新增小工具