当前位置: 首页 > Web前端 > HTML5

【GoWebSocket】多房间聊天室(五)用多个小锁代替大锁提高效率

时间:2023-04-05 15:45:45 HTML5

我是公众号线下派对游戏的作者HullQin(欢迎关注公众号,发送加微信,交个朋友),转载本文必须征得作者HullQin的授权。我独立开发了《联机桌游合集》,这是一个网页,在这里你可以轻松地和朋友一起玩网络游戏,五子棋等游戏,不收费,也没有广告。还为GameJam2022开发了《Dice Crush》,喜欢的话可以关注我HullQin哦~有空我会分享制作游戏的相关技术。背景《Go WebSocket》专栏,有前几篇文章:第一篇:《为什么我选用Go重构Python版本的WebSocket服务?》,介绍我的目标。第二篇文章:《你的第一个Go WebSocket服务: echo server》,介绍了如何编写WebSocket服务端。第三篇:《单房间的聊天室》,介绍如何实现单间聊天室。第四篇:《多房间的聊天室(一)思考篇》,介绍实现多房间聊天室的思路。第五篇:《多房间的聊天室(二)代码实现》,介绍实现多房间聊天室的代码。第六篇:《多房间的聊天室(三)自动清理无人房间》,介绍如何清理一个无人居住的房间,避免内存无限增长的问题。第七篇:《多房间的聊天室(三)自动清理无人房间》,介绍如何避免并发引起的资源竞争问题,通过悲观锁来解决。第八篇:《多房间的聊天室(三)自动清理无人房间》,介绍一个简单的基于GoWebSocket手写的webshell,可以体验直接在浏览器中输入linux命令的感觉~温馨提示:阅读本文前至少需要阅读前7篇文章.如果您还没有阅读前7篇文章,则必须先阅读它们,因为这篇文章比较复杂。如果以上几篇文章看不懂,这篇文章可能跟不上节奏。复习:注册和注销竞争上一篇。我们在上一篇文章中提到,存在黑天鹅事件(小概率事件),注册和注销会竞争资源,导致数据异常。最终我们通过加“悲观锁”解决了问题。需要注意的是,我们上面加的锁是全局锁。这意味着当100个client(即使在不同的房间)同时请求连接时,他们必须排队等待一个一个的处理。等待上一个请求加锁,释放锁后再处理下一个请求。它不能利用goroutine并行性。也就是说,这个“锁”太大了!影响程序运行的效率。如何解决?我们把“锁”拆分成更多的小锁,每个房间用一把锁,这样就解决了问题。确保可以同时处理“来自不同房间的用户连接请求”。用小锁代替大锁用“多个小锁”代替“大锁”可以显着提高各种场景下的并行效率。如下:main.goclient.gohub.go但是每个房间都是锁着的,存放在同一张地图中。要读取这张图,需要引入一个全局锁mutexForRoomMutexes。其实不用担心,现在已经优化了很多!因为可以看到这个锁释放的很快,影响不大。但是上一篇文章中的lockmutex不仅是全局锁,而且耗时很长。源码仓库地址:github.com/HullQin/go-websocket-examples按照这个commit:github.com/HullQin/go-websocket-examples/commit/b12271a9531360d407c22c54c854e177e7e48fda我是HullQin最后,公众号下线了派对游戏作者(欢迎关注公众号,发送加微信,交友),转发本文需获得作者HullQin授权。我独立开发了《联机桌游合集》,这是一个网页,在这里你可以轻松地和朋友一起玩网络游戏,五子棋等游戏,不收费,也没有广告。还为GameJam2022开发了《Dice Crush》,喜欢的话可以关注我HullQin哦~有空我会分享制作游戏的相关技术。