哪些适合使用gevent的场景【知乎】

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

你要做一个千人在线的Web聊天室,聊天室需要能够实时来收发消息。但是,HTTP是无状态的,也就是说,服务器没有直接把消息发给浏览器的能力。所以你往服务器发送数据之后,服务器没法把你的消息推送给其他聊天室的人,但有若干方案可以解决这个问题。

这里假设我们采用常见的长轮询的方案,即客户端请求服务端获取最新的消息,服务器有消息就返回数据,否则将一直保持连接直到超时。这时候,如果千人在线的话,就需要保持1000个连接,如果连接是进程模式或者线程模式,那就要开对应个数的进程或者线程,1000个进程或者线程的切换开销会消耗太多的资源。

你仔细分析这个聊天室的代码执行情况,会发现这么多的进程或者线程大部分时间都是闲的,它们在等浏览器发消息,啥事都没干。针对这个问题,你可以想到,要一个进程在闲的时候去干其他的事情,等这边消息到了再回来处理就好了。gevent把这个功能实现了,切换开销大大降低,系统性能飙升。

总结起来就一句话,如果系统资源过的消耗在进程线程切换上面,用gevent!

 

 

我就说说我用过的场景吧
1.游戏服务器,基本是gevent ,tornado,twisted三选一,如游戏服务器框架gfirefly
2.爬虫,gevent的pool是个大杀器
3.使用gevent加速web应用,如flask搭配gevent,还可以实现长连接(ajax方式),websocket

gevent一般高并发用的比较多,goagent也使用了gevent,openstack使用了eventlet,这是gevent的胞弟

作者:罗伊
链接:https://www.zhihu.com/question/26671162/answer/33616227

 

 

适用于异步IO的高并发场景。如果支持异步IO都建议使用,以便获取极高的并发性能。比如网络访问,读取文件。

参考这篇文章:Does Asynchronous I/O make sense in OpenStack?。大意是说,异步IO框架比如eventlet可以减少内存占用(memory printfeet)但是对于IO密集型和CUP密集型程序意义不大。IO密集型程序一般使用队列技术来保证系统不会崩溃。CUP密集型系统会采取类似的策略。总之这两种系统都不适合并发。

我觉得CPU密集型系统适合并行技术。可以使用高算框架(高性能计算)。



作者:崔钢
链接:https://www.zhihu.com/question/26671162/answer/152760109
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值