gunicorn syncworker

  gunicorn支持不同的worker类型,同步或者异步,异步的话包括基于gevent、基于eventlet、基于Aiohttp(python版本需要大于3.3),也有多线程的版本。下面是gunicorn当前版本(19.6.0)支持的Worker类型:

  • sync
  • eventlet - Requires eventlet >= 0.9.7
  • gevent - Requires gevent >= 0.13
  • tornado - Requires tornado >= 0.2
  • gthread - Python 2 requires the futures package to be installed
  • gaiohttp - Requires Python 3.4 and aiohttp >= 0.21.5

本文主要对同步模型进行分析。同步模型实现(gunicorn.workers.sync.SyncWorker)继承自gunicorn.workers.base.Worker,绝大多数方法都是定义在基类,包括

init_signal

注册信号处理函数

handle_xxx:

各个信号具体的处理函数

notify:

通知父进程自己还活着

run:

需要子类实现的接口,用于处理具体的请求。

init_process:

提供给Arbiter的接口,调用inti_signal和run方法

SyncWorker实现了run方法,对HTTP请求进程处理

def run(self):
       if len(self.sockets) > 1:
            self.run_for_multiple(timeout) # 使用select
       else:
            self.run_for_one(timeout)        # 如果只有一个监听socket,那么阻塞accept就行了

  run方法根据监听的端口数量进行区分,如果只在一个端口监听,那么调用accept; 如果是多个端口,那么用select轮训再accept。不管哪种方式,新的连接请求到达后 都调用handle_request函数处理,源代码如下:

  

    def handle_request(self, listener, req, client, addr):
        environ = {}
        resp = None
        try:
            self.cfg.pre_request(self, req)
            request_start = datetime.now()
            resp, environ = wsgi.create(req, client, addr,
                    listener.getsockname(), self.cfg)
            # Force the connection closed until someone shows
            # a buffering proxy that supports Keep-Alive to
            # the backend.
            resp.force_close()
            self.nr += 1
            if self.nr >= self.max_requests:
                self.log.info("Autorestarting worker after current request.")
                self.alive = False
            respiter = self.wsgi(environ, resp.start_response)
            try:
                if isinstance(respiter, environ[‘wsgi.file_wrapper‘]):
                    resp.write_file(respiter)
                else:
                    for item in respiter:
                        resp.write(item)
                resp.close()
                request_time = datetime.now() - request_start
                self.log.access(resp, req, environ, request_time)

  其中,调用到App的是下面这行代码

   respiter = self.wsgi(environ, resp.start_response)

  前面提到worker通过notify来向master进程做心跳,具体的代码在WorkerTmp.py。原理很简单:

(1)首先通过tempfile.mkstemp创建一个临时文件

(2)worker进程在每次轮训的时候修改该临时文件的属性

    

    def notify(self):
        try:
            self.spinner = (self.spinner + 1) % 2
            os.fchmod(self._tmp.fileno(), self.spinner)
        except AttributeError:
            # python < 2.6
            self._tmp.truncate(0)
            os.write(self._tmp.fileno(), b"X")

(3)master进程检查临时文件最新一次修改时间是否超过阈值

    

    def last_update(self):
        return os.fstat(self._tmp.fileno()).st_ctime

references:

http://docs.gunicorn.org/en/stable/

http://docs.gunicorn.org/en/stable/signals.html

https://github.com/benoitc/gunicorn

时间: 2024-10-19 14:02:44

gunicorn syncworker的相关文章

gunicorn syncworker 源码解析

gunicorn支持不同的worker类型,同步或者异步,异步的话包括基于gevent.基于eventlet.基于Aiohttp(python版本需要大于3.3),也有多线程的版本.下面是gunicorn当前版本(19.6.0)支持的Worker类型: sync eventlet - Requires eventlet >= 0.9.7 gevent - Requires gevent >= 0.13 tornado - Requires tornado >= 0.2 gthread -

gunicorn Arbiter 解析

如前文所述,Arbiter是gunicorn master进程的核心.Arbiter主要负责管理worker进程,包括启动.监控.杀掉Worker进程:同时,Arbiter在某些信号发生的时候还可以热更新(reload)App应用,或者在线升级gunicorn.Arbiter的核心代码在一个文件里面,代码量也不大,源码在此:https://github.com/benoitc/gunicorn. Arbiter主要有以下方法: setup: 处理配置项,最重要的是worker数量和worker工

gunicorn Arbiter 源码解析

如前文所述,Arbiter是gunicorn master进程的核心.Arbiter主要负责管理worker进程,包括启动.监控.杀掉Worker进程:同时,Arbiter在某些信号发生的时候还可以热更新(reload)App应用,或者在线升级gunicorn.Arbiter的核心代码在一个文件里面,代码量也不大,源码在此:https://github.com/benoitc/gunicorn. Arbiter主要有以下方法: setup: 处理配置项,最重要的是worker数量和worker工

CMDB之部署Django Nginx+Gunicorn+virtualenv+supervisord应用

应用搭建好了,该上线部署: 虚拟环境需安装的包: (Dfcenv) [[email protected] Dfcenv]# pip list Django (1.10.1) gunicorn (19.6.0) meld3 (1.0.2) MySQL-python (1.2.5) pip (8.1.2) setuptools (26.1.1) supervisor (3.3.1) wheel (0.29.0) gunicorn配置如下: (Dfcenv) [[email protected] Df

Nginx+Gunicorn+virtualenv+supervisord+Postgresql部署Django应用

关于Django应用部署 Django是一个高效.多功能和动态地进化的Web应用开发框架.目前比较流行的部署.运行Django应用方式是基于Apache的mod_wsgi模块,但更加高效.弹性,同时又更加复杂的方式是使用以下工具来部署实施:Nginx.Gunicorn.virtualenv.supervisord.Postgresql.以下详细介绍如何结合这些工具来部署Django应用到Linux上. 准备工作 需要有一台拥有root权限的Linux服务器,这是部署应用的平台.本文采用CentO

nginx+django+gunicorn+gevent+supervisor

安装环境介绍: python2.7.10 django1.7.9 linux CentOS release 6.5 (Final) 64 假设我的项目位置为/var/www/myweb 服务器IP为192.168.0.100 1.插件安装 gunicorn-19.7.1   uwsgi组件 gevent-1.2.1    异步组件 greenlet-0.4.12  异步组件 supervisor-3.3.0 进程管理组件 直接下载然后运行 对应的 python setup.py install

centos6.5腾讯云django环境部署---2、Gunicorn+Django+nginx+mysql部署

接上一章:已经按照之前章节安装了Python2.7.10,Django 1.8.14. 以及mysql,并创建了数据库以及数据库帐号密码. 一.安装nginx yum -y install nginx #设置nginx开机启动: chkconfig nginx on 启动nginx:service nginx start 启动报错:nginx: [emerg] socket() [::]:80 failed (97: Address family not supported by protoco

python+nginx+gunicorn 部署django小记

部署环境 Ubuntu 12.04 LTS django 1.6.2 nginx 1.1.19 guniron 19.3.0 安装配置各项 安装django: pip install django==1.6.2 装nginx,此步适用ubuntu: apt-get install nginx 其它: 推荐源码安装 nginx命令: 启动:  /etc/init.d/nginx start 停止: /etc/init.d/nginx stop 测试配置文件是否正确: nginx -t 配置prox

使用gunicorn部署python web

gunicorn 是一款支持wsgi的web服务器, 支持gevent 首先安装setuptools.  wget https://bootstrap.pypa.io/ez_setup.py $python ez_setup.py $easy_install pip $pip install gevent $pip install gunicorn $apt-get install libmysqld-dev $pip install MySQL-python 安装完成后 既可以直接执行 gun