for循环能否加阻塞。不使用通道

admin87 · 2017-11-26 16:23:47 · 3128 次点击 · 大约8小时之前 开始浏览    置顶
这是一个创建于 2017-11-26 16:23:47 的主题,其中的信息可能已经有所发展或是发生改变。

现用heap做了一个优先级列队。一个线程写。一个线程读。有数据就读。想用for 循环读不知道如何加个组塞。可以在没有数据时停止。有数据自动读取。 谢谢


有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

3128 次点击  
加入收藏 微博
7 回复  |  直到 2017-11-28 00:06:30
specita
specita · #1 · 7年之前

用chan会很方便实现这个功能,或者

for {
heap.isEmpty{
   sleep(1000)
} 

///other code

}
specita
specita · #2 · 7年之前
specitaspecita #1 回复

用chan会很方便实现这个功能,或者 ``` for { heap.isEmpty{ sleep(1000) } ///other code } ```

少打个if..

momaek
momaek · #3 · 7年之前
for {
  if heap.isEmpty{ continue }

  // other
}
zweite
zweite · #4 · 7年之前
momaekmomaek #3 回复

``` for { if heap.isEmpty{ continue } // other } ```

这样对CPU不太友好,太消耗CPU了

admin87
admin87 · #5 · 7年之前
momaekmomaek #3 回复

``` for { if heap.isEmpty{ continue } // other } ```

谢谢。golang没有一个函数可以手动组塞嘛。我现在也只是想到在结构里加一个通道。随意咨询的还有没有其他办法

Adol1111
Adol1111 · #6 · 7年之前

用time.Sleep就行了,我目前就是这样用的。

for {
  if heap.isEmpty{
     time.Sleep(5 * time.Second)
  }

  // other
}

如果你想没有数据自动阻塞,有数据自动消费,目前应该只有channel可以做到。

还有就是这个例子里千万别把sleep改为continue,不是对CPU友不友好的问题,而是这样写线程有很高几率被hang死。

因为go的协程是非抢断式的,如果一个goroutine没有打断点(函数调用等),会一直等到执行完毕再切换goroutine。如果是耗时特别久的计算,或for{}死循环,当中没有打断点,goroutine会一直占有执行线程直到遇到打断点,而死循环又不存在打断点始终continue。最坏的结果就是整个线程hang死,生产者无法执行,消费者为空却一直执行(即使有runtime.GOMAXPROCS(runtime.NumCPU())也一样,go本身bug?)。

遇到这两种情况,建议是用sleep或者runtime.Gosched()主动打断

admin87
admin87 · #7 · 7年之前
Adol1111Adol1111 #6 回复

用time.Sleep就行了,我目前就是这样用的。 ``` for { if heap.isEmpty{ time.Sleep(5 * time.Second) } // other } ``` 如果你想没有数据自动阻塞,有数据自动消费,目前应该只有channel可以做到。 还有就是这个例子里千万别把sleep改为continue,不是对CPU友不友好的问题,而是这样写线程有很高几率被hang死。 因为go的协程是非抢断式的,如果一个goroutine没有打断点(函数调用等),会一直等到执行完毕再切换goroutine。如果是耗时特别久的计算,或for{}死循环,当中没有打断点,goroutine会一直占有执行线程直到遇到打断点,而死循环又不存在打断点始终continue。最坏的结果就是整个线程hang死,生产者无法执行,消费者为空却一直执行(即使有runtime.GOMAXPROCS(runtime.NumCPU())也一样,go本身bug?)。 遇到这两种情况,建议是用sleep或者runtime.Gosched()主动打断

谢谢

添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传