服务器程序源代码分析之三:gunicorn

时间:2014-05-09 11:33:54 类别:网站架构 访问: 641 次

gunicorn是一个python web 服务部署工具,类似flup,完全用python开发,参考了ruby的部署工具: Unicorn project

gunicorn主要功能:

  • wsgi-http 协议的转换

    python有一个官方的module叫做WSGI(The Web Server Gateway Interface),版本号PEP333,定义了一些接口规范

    所以凡是python web框架都会遵守这个规范,django或者web.py都是这样

  • gunicorn对协议的支持很单一:输入wsgi,输出http

    flup也是输入wsgi,但支持多种输出:ajp,cgi,fcgi,scgi,就偏偏不支持http

    所以flup和gunicorn是前浪后浪的关系

  • IO模型采用pre-fork模式
  • 子进程里面,可以支持sync,eventlet,gevent,tornado 4种网络处理方法,默认用sync
  • gunicorn的代码质量比较差,起码比flup要差,缺乏python-style

    python-style:只要看看python自带的lib就了然,就是那种感觉

sync的实现

  1. 采用阻塞的accept等待新连接
  2. 一旦连接成功,就用select来驱动所有的client

select是遍历fd_set的方式,并且在linux有句柄数量必须小于1024的限制,这两点导致了sync模式的并发能力有限,flup也是这样,如果选择sync模式,那么和用 flup 没有什么区别

gunicorn还可以采用异步IO

  • 可以通过import代码包的方式,使用eventlet,gevent,tornado 之一
  • 这3种都是高性能异步IO(Fast event loop based on libev (epoll on Linux, kqueue on FreeBSD))
  • python 2.6就在select module里面加上了epoll/poll/kqueue/kevent 支持,把sync模块 改造为高性能异步IO其实非常容易

标签: 网络程序IO模型pythongunicorn

本文地址: http://lutaf.com/219.htm 鲁塔弗原创文章,欢迎转载,请附带原文链接

服务器程序源代码分析之三:gunicorn的更多相关文章

  1. PostgreSQL的 initdb 源代码分析之三

    继续 其实接前面,整个while循环是这样的: ) { switch (c) { ...... } ...... } 这一句,c = getopt_long(argc, argv, "dD: ...

  2. Android系统默认Home应用程序(Launcher)的启动过程源代码分析

    在前面一篇文章中,我们分析了Android系统在启动时安装应用程序的过程,这些应用程序安装好之后,还需要有一个 Home应用程序来负责把它们在桌面上展示出来,在Android系统中,这个默认的Home ...

  3. Android应用程序安装过程源代码分析

    文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6766010 Android系统在启动的过程中, ...

  4. Android应用程序进程启动过程的源代码分析

    文章转载至CSDN社区罗升阳的安卓之旅,原文地址: http://blog.csdn.net/luoshengyang/article/details/6747696 Android 应用程序框架层创 ...

  5. Android应用程序绑定服务(bindService)的过程源代码分析

    文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6745181 Android应用程序组件Serv ...

  6. Android应用程序内部启动Activity过程(startActivity)的源代码分析

    文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6703247 上文介绍了Android应用程序的 ...

  7. Android系统进程间通信Binder机制在应用程序框架层的Java接口源代码分析

    文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6642463 在前面几篇文章中,我们详细介绍了A ...

  8. Android应用程序框架层和系统运行库层日志系统源代码分析

    文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6598703 在开发Android应用程序时,少 ...

  9. Android应用程序组件Content Provider的启动过程源代码分析

    文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6963418 通过前面的学习,我们知道在Andr ...

随机推荐

  1. linux中vsftpd登陆慢卡问题解决方法

    1.修改服务器上的/etc/resolv.conf令其内容只有类似 nameserver 192.81.133.229 nameserver 114.114.114.114 出现问题的机器的resol ...

  2. Xcode-项目模板修改

    项目模板就是创建工程的时候选择的某一个条目, Xcode会根据选择的条目生成固定格式的项目 例如想创建一个命令行项目就选择Command Line Tool 如何修改项目模板 1.应用程序中,找到Xc ...

  3. Jquery 自定义事件实现发布/订阅

    //用户点击logoff按钮时,广播一个自定义事件,给任何需要保存状态的感兴趣的观察者,然后导航到logoff页面 $('#logoff').click(function(){ $.event.tri ...

  4. 暑假集训(4)第二弹 -----递推(hdu2254)

    题意概括:上次小A在你的帮助下成功炼成贤者法阵的第一部分——三角分隔,现在他准备绘制法阵的第二部分——莫测矩形. 而他又遇到了一个问题,他不知道不同矩形到底有多少个. 秉持帮人帮到底,送佛送到西的基本 ...

  5. 函数 resize和reserve的区别

    reserve是容器预留空间,但在空间内不真正创建元素对象,所以在没有添加新的对象之前,不能引用容器内的元素.加入新的元素时,要调用push_back()/insert()函数. resize是改变容 ...

  6. mysql安装启动教程(两种方法)

    mysql安装启动: 方法一(简单版): cmd进入mysql安装的bin目录:mysqld.exe –install net start mysql  服务启动(或者选择计算机->(右键)管理 ...

  7. SVN全量备份+增量备份脚本

    一.全量备份 环境:一台主SVN,一台备SVN(主要提供备份功能),后续可通过钩子脚本进行实时备份,后续发给大家. 工作原理:通过svn的hotcopy命令过行热备份,并进行一系列的检查,备份后通过r ...

  8. 弹性布局学习-详解align-content(六)

    弹性布局学习-详解align-content(六)

  9. 布局—column(属性)

    column-width:||用来定义多列中每列的宽度,用像素表示column-count:||用来定义多列中的列数,用数字来表示1-10columns: 200px 2||列宽和列数column-g ...

  10. Android使用百度地图API实现GPS步行轨迹

    百度地图Android SDK下载:http://developer.baidu.com/map/sdkandev-download.htm 下面是效果: 采样点取得太频繁所以看起来像是一个个点... ...