有哪些应用场景适合用python的gevent来完成

有哪些应用场景适合用python的gevent来完成,第1张

一种技术的出现必然是为了解决某种问题,gevent是为了解决什么问题呢,设想下面这种情况。

你要做一个千人在线的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方面也已经使用这种方案,可见性能和稳定性应该都还是可以的


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zaji/7268009.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-03
下一篇2023-04-03

发表评论

登录后才能评论

评论列表(0条)

    保存