简单聊天室的并发问题

goit · · 1954 次点击
你的代码封装方式略微改进: 1、map没有加锁,按经验,连接断开与新建的时候,会崩溃。或许是客户端增加连接的时候,没有执行断开操作。 2、对于补充的计数器,也面临两个go携程的并发问题,可以封装一下,内部加锁,提供准确的计数。mutex还是很快的。 3、发送消息的时候每次都是按序执行,可以用go func来包装发送服务,参见常见的订阅发布模型的写法:(协程太多也不合适,需要考虑控制协程数) ```Go for key, value := range conns { go func(){//<----协程调用 _, err := value.Write([]byte(msg)) if err != nil { delete(conns, key) } else { i++ } }() } ``` 4、你的打印语句严重影响性能,可以1w5很不错了。
#1
更多评论
代码有点问题,需要增加输入参数.Sorry ```Go for key, value := range conns { go func(bytes []byte){//<----协程调用 _, err := value.Write(bytes) if err != nil { delete(conns, key) } else { i++ } }(msg) } ```
#2
谢谢。看来速度方面小修改帮助不大,只能参考模式来写了。开始map没有加锁也没出错是因为只有两个协程,操作不频繁所以没发生冲突。不过你改的参数有问题,要这样 ``` for key, value := range conns { go func(key string, value net.Conn) { _, err := value.Write([]byte(msg)) if err != nil { lock.Lock() delete(conns, key) lock.Unlock() } else { i++ } }(key, value) } ``` 并发应该不影响计数,为什么`messages <- reciveStr`之后计数就不准确了呢?
#3