一种技术的出现必然是为了解决某种问题,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
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。