初级会员
  • 第 1980 位会员
  • msn217
  • baoke.71@163.com
  • 2014-11-26 03:43:39
  • Offline
  • 20 25

最近发布的主题

    暂无

最近发布的文章

    暂无

最近分享的资源

    暂无

最近发布的项目

    暂无

最近的评论

  • ``扩起来的内容表示struct tag,主要用到json.Marshal()中,具体规则可以自己google之.
  • #10 @star24 这是因为其他goroutine运行的cpu资源占用还不是很多,并未达到使系统挂掉的程度,而你最后一个goroutine执行完,<-ch得以释放,主程序就结束了,所以没问题.你如果想要验证这个问题就在主程序最后加上一个sleep时间,让其他goroutine可以运行一下,占用cpu资源,便会发现每次程序都会挂掉.
  • #5 @star24 正常情况下之所以能够安全退出,是因为当<-ch都能够释放时,如果此时cpu使用率还不是很高,(能够继续运行主程序记下来的运算),主程序结束,导致整个程序结束,系统资源释放,死循环也就会结束了,所以对系统没有影响.但是这种情况下,你在主程序最后加上time.Sleep(1*time.Second),让主程序不要立即结束,而是给其他goroutine中死循环一定的运行时间,你变会发现每次程序都会挂掉,cpu运行都会达到100% 2)在运行过程中,你指定了程序运行的核数,则整个程序便会在这些核中自己进行调度分配,当一个核由于goroutine阻塞,则该核上的其他goroutine便会迁移到其他核运行(这是由系统自动实现的).3)程序陷入死循环后,只是指定运行核的cpu达到100%,如果你并不是指定所有的核作为程序运行核,你便会发现其他核的cpu使用率并不高.
  • 问题应该是你的死循环问题上面.运行死循环占用大量cpu资源,这时候其他任务就不能正常执行,因此会出现程序"死亡"状态.该程序删掉j的死循环便可正常执行.
  • 评论了博文 Go并发编程——channel
    @luan_tianjiao 3缓冲机制中 c := make(chan int, 10) for i:=0;i<10;i++{ c<-12 } fmt.Println(len(c)) for j := range c{ fmt.Println(j) } 这部分代码报错,出现死锁的原因在 for j := range c,这段会一直循环监听channel c,而channel c 中没有缓存后便会阻塞,从而造成死锁. 解决办法两种:1)在生产者地方通过close()主动关闭channel,具体如下: for i:=0;i<10;i++{ c<-12     close(c) } 方法2:将消费者另开一个goroutine执行,阻塞另一个goroutine,而不阻塞主程序,具体如下: go func(){ for j := range c{ fmt.Println(j) }() time.Sleep(1*time.Second)