websocket阻塞,正常发送消息的时候发现发送消息那块会阻塞,求大神指点下这是什么原因

zifeiyu · 2018-01-29 10:05:05 · 4367 次点击 · 大约8小时之前 开始浏览    置顶
这是一个创建于 2018-01-29 10:05:05 的主题,其中的信息可能已经有所发展或是发生改变。

QQ图片20180129095739.png

看打印日志是 --2 打印了,--3没有打印,然后后续发送消息全部阻塞了


有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

4367 次点击  
加入收藏 微博
6 回复  |  直到 2018-02-05 16:19:35
channel
channel · #1 · 7年之前

有超时吗?

zifeiyu
zifeiyu · #2 · 7年之前
channelchannel #1 回复

有超时吗?

没有超时

sunanxiang
sunanxiang · #3 · 7年之前

有更完整的代码吗?可以打出来看一看

zifeiyu
zifeiyu · #4 · 7年之前
sunanxiangsunanxiang #3 回复

有更完整的代码吗?可以打出来看一看

123.png

sunanxiang
sunanxiang · #5 · 7年之前
zifeiyuzifeiyu #4 回复

#3楼 @sunanxiang ![123.png](https://static.studygolang.com/180205/8ebd9228cdece0dce6defac30e89f8e3.png)

原因是你SendMsgToClient 那个函数里面,出错的根本原因是你Msg_to_client 通道 和DelconnMsg 通道所在的goroutine 退出了,导致你for 循环里面接受的channel 没有其他goroutine 向里面传输数据,所以导致deadlock 。go 里面,for select 所监听的通道,如果没有其他携程向通道写入数据,那么这个for 就会deadlock。

sunanxiang
sunanxiang · #6 · 7年之前
package main

import (
    "fmt"
    //"time"
)

func main() {
    var (
        chaA = make(chan int)
        chaB = make(chan int)
        //timer = time.NewTicker(time.Second)
    )

    go func() {
        chaA <- 1
        chaB <- 2
    }()

    for {
        select {
        case <-chaA:
            fmt.Println("1111")
            break
        case <-chaB:
            fmt.Println("2222")
            break
        //case <-timer.C:
        //    fmt.Println("nihao")
        //    break
        }
        fmt.Println("break here")
    }

    fmt.Println("break there")
}

你用一下上面的代码,分别使用注释和没有注释的部分,就很清楚了。

添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传