打断阻塞的读操作:
c := make(chan, bool)
<-c //如果没有进程写入,就会阻塞

close(c)

打断阻塞的写操作:
c := make(chan, bool)
c <- true //如果没有进程读出,就会阻塞

CLEAR:
for {
  select {
    case <-c: continue
    default: break CLEAR
  }
}
这会持续读出所有写入c的消息,直到没有更多的写入(default会被执行

刚才用runtime.NumGoroutine()看了下gnet,发现有很多goroutine没有正确地关闭,大部分是因为在写chan时卡住了