现用heap做了一个优先级列队。一个线程写。一个线程读。有数据就读。想用for 循环读不知道如何加个组塞。可以在没有数据时停止。有数据自动读取。
谢谢
用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()主动打断
#6
更多评论
用chan会很方便实现这个功能,或者
```
for {
heap.isEmpty{
sleep(1000)
}
///other code
}
```
#1