
你要做一个千人在线的Web聊天室,聊天室需要能够实时来收发消息,但是HTTP是无状态的,就是说服务器没有直接把消息发给浏览器的能力。你往服务器发送数据之后,服务器没法直接把你的消息推送给其他聊天室的人,但有若干方案可以解决这个问题。
这里假设我们采用常见的长轮询的方案,即客户端请求服务端获取最新的消息,服务器有消息就返回数据,否则将一直保持连接,直到超时。这时候,如果千人在线的话,就需要保持1000个连接,如果连接是进程模式或者线程模式,那就要开对应个数的进程或者线程,1000个进程或者线程的切换开销会消耗太多的资源。
你仔细分析这个聊天室的代码执行情况,会发现这么多的进程或者线程大部分时间都是闲的,它们在等浏览器发消息,啥事都没干。
针对这个问题,你可以想到,要一个进程在闲的时候去干其他的事情,等这边消息到了再回来处理就好了。gevent把这个功能实现了,切换开销大大降低,系统性能飙升。
我写的flask服务,里面使用了grequests(其实就是gevent+requests),然后又让flask_apscheduler启动一个脚本去查TIDB(跟mysql差不多)。报了下面这个错误。
大概可以理解为flask_apscheduler需要另取一个线程,他跟gevent的协程有点冲突。暂时是这么理解的。如果有错误,欢迎大佬指正。
推荐使用sqlalchemy+pymysql。DBUtils对python3支持不够。sqlalchemy+pymysql可以很好的支持python3,可以通过gevent或pypy提供性能,并且openstack在orm方面也已经使用这种方案,可见性能和稳定性应该都还是可以的欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)