现用heap做了一个优先级列队。一个线程写。一个线程读。有数据就读。想用for 循环读不知道如何加个组塞。可以在没有数据时停止。有数据自动读取。 谢谢
有疑问加站长微信联系(非本文作者)

现用heap做了一个优先级列队。一个线程写。一个线程读。有数据就读。想用for 循环读不知道如何加个组塞。可以在没有数据时停止。有数据自动读取。 谢谢
有疑问加站长微信联系(非本文作者)
入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889
`单行代码`
用chan会很方便实现这个功能,或者
少打个if..
这样对CPU不太友好,太消耗CPU了
谢谢。golang没有一个函数可以手动组塞嘛。我现在也只是想到在结构里加一个通道。随意咨询的还有没有其他办法
用time.Sleep就行了,我目前就是这样用的。
如果你想没有数据自动阻塞,有数据自动消费,目前应该只有channel可以做到。
还有就是这个例子里千万别把sleep改为continue,不是对CPU友不友好的问题,而是这样写线程有很高几率被hang死。
因为go的协程是非抢断式的,如果一个goroutine没有打断点(函数调用等),会一直等到执行完毕再切换goroutine。如果是耗时特别久的计算,或for{}死循环,当中没有打断点,goroutine会一直占有执行线程直到遇到打断点,而死循环又不存在打断点始终continue。最坏的结果就是整个线程hang死,生产者无法执行,消费者为空却一直执行(即使有runtime.GOMAXPROCS(runtime.NumCPU())也一样,go本身bug?)。
遇到这两种情况,建议是用sleep或者runtime.Gosched()主动打断
谢谢