初级会员
  • 第 14563 位会员
  • Adol1111
  • 2017-11-27 16:00:40
  • Offline
  • 20 5

最近发布的主题

    暂无

最近发布的文章

    暂无

最近分享的资源

    暂无

最近发布的项目

    暂无

最近的评论

  • 评论了主题 redis连接池问题
    举个简单的例子,比如有个等候室,有一个处理室,然后当中有一条10M长的通道。同时只能有1个人进入处理室,现在有2个方案 1. 大家都在等候室里,等到处理室的人返回再让第二个人再走过走廊 2. 直接在处理室门口(走廊)排队等着 同样都是单线程处理,还是稍微有点区别的
  • 用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()主动打断