gunicorn分析 基于 tag0.2
来源:互联网 发布:python sorted key 编辑:程序博客网 时间:2024/06/14 06:19
gunicorn 工作原理
1.工作模型
gunicorn采用的是master-worker模型,一个master进程,多个worker进程。master进程负责管理worker进程
def spawn_workers(self): workers = set(w.id for w in self.WORKERS.values()) for i in range(self.num_workers): if i in workers: continue worker = Worker(i, self.pid, self.LISTENER, self.modname, self.timeout) pid = os.fork() if pid != 0: self.WORKERS[pid] = worker continue worker_pid = os.getpid() try: self.log.info("Worker %s booting" % worker_pid) worker.run() sys.exit(0) except SystemExit: raise except: self.log.exception("Exception in worker process.") sys.exit(-1) finally: worker.tmp.close() self.log.info("Worker %s exiting." % worker_pid)
下面我来个简化版的:
main.py
import os, socket, sysfrom worker import Workerprint os.getpid(), 'process start'sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)sock.setblocking(0)sock.bind(("127.0.0.1", 5000))sock.listen(2048)for i in range(3): w = Worker(i, os.getpid(), sock) pid = os.fork() if pid != 0: continue try: w.run() sys.exit(0) except SystemExit: raise except: sys.exit(-1)# for read consoleimport timetime.sleep(200)print 'end!'
# -*- coding: utf-8 -import errnoimport osimport selectimport socketCHUNK_SIZE = (16 * 1024)def read_partial(sock, length): while True: try: ret = select.select([sock.fileno()], [], [], 0) if ret[0]: break except select.error, e: if e[0] == errno.EINTR: continue raise data = sock.recv(length) return dataclass Worker(object): def __init__(self, workerid, ppid, socket): self.id = workerid self.ppid = ppid self.socket = socket self.timeout = 10 self.alive = True def run(self): while self.alive: nr = 0 while self.alive: try: client, addr = self.socket.accept() buf = '' while True: data = read_partial(client, CHUNK_SIZE) if not data: break buf += data print buf nr += 1 except socket.error, e: if e[0] in (errno.EAGAIN, errno.ECONNABORTED): print 'socekt.error' break # Uh oh! raise if nr == 0: break while self.alive: try: ret = select.select([self.socket], [], [], self.timeout) if ret[0]: break except select.error, e: if e[0] == errno.EINTR: print 'select error', os.getpid() break raise
在Linux进行非阻塞的socket接收数据时经常出现Resource temporarily unavailable,errno代码为11(EAGAIN)
这表明你在非阻塞模式下调用了阻塞操作,在该操作没有完成就返回这个错误,
这表明你在非阻塞模式下调用了阻塞操作,在该操作没有完成就返回这个错误,
这个错误不会破坏socket的同步,可以不用管它,循环接着recv就可以。
0 0
- gunicorn分析 基于 tag0.2
- flask一次request请求过程 基于tag0.2和0.3
- gunicorn源码分析
- flask一次request请求过程 基于tag0.1
- flask一次request请求过程 基于tag0.7
- gunicorn配置文件
- gunicorn timeout
- gunicorn 简介
- gunicorn常用命令
- nginx+gunicorn运行django
- nginx+gunicorn+django
- nginx+gunicorn+bottle
- gunicorn部署django实例
- 【Django】 gunicorn部署纪要
- Gunicorn启动Thrift服务
- Nginx + Gunicorn(+gevent) + Django
- Flask + Gunicorn + Nginx 部署
- gunicorn + nginx + django
- 资源管理器
- POJ 2387 Til the Cows Come Home(Dijkstra,重边)
- linux经验之谈
- H5新标签 <figcaption> 定义图文并茂的html5新标签-figure、figcaption
- [CLI]svn
- gunicorn分析 基于 tag0.2
- Android的线程和线程池
- CentOS 添加环境变量的三种方法
- 欢迎使用CSDN-markdown编辑器
- python numpy
- C#开发step步骤条控件
- SpringBoot+Shiro学习之自定义拦截器管理在线用户(踢出用户)
- 图论概念:Degree Centrality 和 Betweenness Centrality
- hdu2675二分解方程