想做一个多用户的在线群聊软件,服务器端需要存储在线用户列表,具体来说就是新用户登录的时候将客户端套接字存储在用户列表(字典)中,发送消息时遍历用户列表并进行广播,用户登出的时候将客户端套接字从用户列表中删除。以上三个操作可能会在不同的线程中同时执行,我想用python中的列表存储在线用户列表,这样会不会因为多个线程同时访问一个列表而导致同步出错?
东方不败
因为以上三个操作均具有独立性,容错性较大;不安全,但是实践过程中按这个思路几乎不会出错,即时出错,也没关系。不过我觉得应该没有涉及到线程;大多python的web服务器应该都是单进程阻塞型的,单进程阻塞对于某些请求也能达到5000QPS。
若做多人聊天室,建议选用对Websocket比较支持的web服务器,比如tornado,tornado的创作者是friendfeed,Facebook收购friendfeed后依托其在在线聊天领域的经验,使用tornado的Websocket来做Facebook的在线聊天系统。(当然估计这只是一个阶段性的,后来Facebook的聊天系统肯定重构了;这个故事记得不是太清了,很久以前似乎看过)除了tornado,有很多比较新的web服务器都支持Websocket了,其实思路都差不多的。
但是,你要注意一个事情,你只有一个web服务器进程吗?如果是一个,那好说,都存到内存中去即可,在大多python的web服务器程序中不存在线程安全的问题,直接按这个思路去做即可。
若是不只一个web服务器进程;如果问题比较简单的话,那就通过url的辨认,让nginx把相同url的Websocket请求发到同一个指定的web服务器程序上,一个url地址就是代表一个聊天室地址,不同的聊天室之间是不相干的。不过需要在nginx中设置一下反向代理的规则,具体得查查,我也忘了怎么设置。
若是太复杂,得做特殊的即时消息的中间件;这是一个比较复杂的系统,可以试着自己如何从底层做起,不过若是为了应用,可以直接使用云计算平台的相关服务。若从学习角度,推荐试着自己去做,虽然是重复造轮子,但是这对个人学习成长有很大帮助。
撸代码,小撸怡情,大撸伤身。掌握好度,别太累咯~要深挖下去,这个知识点能挖将近半年。最后要说的,万事别忘了备案,ICP备和公安网备,聊天室是交互类型,是严查严打的,手续一定要全。