golang的阻塞

golang有所谓的阻塞,也就是说,等待io变化,比如select 监听信道变化,等待websocket连接变化,而这个阻塞,同时也会带来代码上的阻塞,比如

         for {

                select {

                case <-ticker.C:

                        Println(“time counting”)

                        //发送一个ping信号

                        if err := c.ws.WriteMessage(websocket.PingMessage, []byte{}); err != nil {

                                return

                        }

                case flag := <-c.shutdown:

                        if flag == true {

                                Println(“shuting down”)

                                return

                        }

                }

        }

defer func() {

                Println(“stoping”)

                c.ws.Close()

                h.unregister <- c

                close(c.shutdown)

        }()

 这个defer是没有用的,因为会监听信道变化,代码执行到for之后,就不再执行了,即使加上break,因为在for循环里面,直接return掉了,defer事件根本没有注册上,所以最好的办法就是把defer向上移动,放在for循环之前。同一个函数里面,绝对不能放两个阻塞的监听,要通过信道控制变化

Leave a comment

Your email address will not be published.

*