socketref,再见!高德

https://github.com/adoggie

  C++博客 :: 首页 :: 联系 :: 聚合  :: 管理
  246 Posts :: 4 Stories :: 312 Comments :: 0 Trackbacks

常用链接

留言簿(54)

我参与的团队

搜索

  •  

最新评论

阅读排行榜

评论排行榜

gevent作为一款优秀的网络通信框架,其出色的性能得到大家一致认可,但在处理并行任务的时候也要注意很多问题,不然您的服务器将变得异常缓慢。
http://blog.163.com/lxl_1995/blog/static/677173392012724103742746/
这篇
博文讲的非常清楚,建议读一下 

gevent的特点如下: 
 1. 单线程执行,所有协程都在同一进程中被模拟和调度分派
 2. 可以创建成千上万的 协程,而不会受任何性能影响
3. 由于spawn的协程不是os分配和管理,所以不会有额外的线程资源分配,cpu也不用在这些线程之间调度切换
4. 单线程执行,无需考虑资源互斥
5. 协程之间切换是通过gevent的io阻塞完成,例如 gevent.sleep(0), queue.get/put,event,socket....
    每调用一次gevent 的api,gevent就能获得一次schedule的机会(这很类似操作系统的用户调用中断,由用户态切换到内核态)

 以上特点保证gevent的性能非常出色,但当我们的server用到第三方软件包的时候那要非常小心了,特别是这些包内部涉及了io操作。
如果第三方软件包是纯python的那很简单,只需要gevent.monkey_patch(xxx)就okay; 但如果包是扩展clib,那要当心了,monkey_patch
并不能将其相关io操作打上补丁,为了使用这些第三方软件包,要求这些软件包必须支持 协程异步 接口(调用其同步io接口,将阻塞住gevent的执行线程,那gevent就完蛋了)。
gevent的patch对psycopg2无效,因为psycopg2的通信部分是c接口的函数库,还好psycopg2内部支持协程,需要使用 到 psycogreen 这个东东
psycogreen.gevent.patch_psycopg() 支持协程
之后的在gevent的线程中执行sql并等待数据返回时,gevent立马将执行切换到另外的线程

gvent项目中会用到各种诸多的第三方库,必须要求这些库的io接口不能是阻塞的,也就是能支持到gevent异步模式

应用逻辑代码在被执行时(无系统api呼叫),单线程比多线程执行速度更快。循环执行一段计算二次函数代码,由于期间没有系统api调用,os不能进行内核tasklet切换,所以导致cpu的峰值可以攀升到90%,直到硬件、时钟等中断产生,强行切换到其他线程。 多核心cpu表现为单个核始终异常的忙碌,其他几个比较空闲。 
posted on 2013-09-24 23:47 放屁阿狗 阅读(528) 评论(0)  编辑 收藏 引用 所属分类: gevent

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理