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

admin87 · · 2893 次点击
用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