BaseServer: 定义基础服务器接口,这些功能接口提供给子类继承。同时提供服务处理的骨架
serve_forever() 循环调用 handle_request()
handle_request() 调用子类的get_request() ,在tcpServer时实则进行accept()应答; 验证处理 verify_request();
最终处理请求 process_request(),
verify_request() 虚函数
process_request() 虚函数,这个函数并没有直接在BaseServer的子类TcpServer中被重载,而是在TcpServer的派生类中通过另一个父类来实
现,比如 ThreadingTCPServer的基类ThreadingMixIn.process_request()实现了此功能函数
finish_request(request, client_address)
执行一次完整的socket数据读入处理,如果是ThreadMixInTcpServer产生的request,这个方法内必须实行循环读取
socket数据,直到socket关闭。(此处 request 就是 socket对象)
def finish_request(self, request, client_address):
“”"Finish one request by instantiating RequestHandlerClass.”"”
self.RequestHandlerClass(request, client_address, self)在finish_request里面便将读取socket数据的任务扔给了RequestHandler去处理了,代码可以跳过去看了
##———————————————
TcpServer: tcp服务器
__init__(self, server_address, RequestHandlerClass) 需要提供服务侦听地址和请求处理类对象
server_bind() 绑定服务器地址
server_activate() 激活服务器
server_close() 关闭服务器
fileno() 返回服务器socket的句柄fd编号
get_request() 接收应答accept()
close_request(request) 关闭socket,request即为socket对象
三种输出处理方式: 阻塞方式、线程处理(ThreadingMixIn)、进程处理(ForkingMixIn)
ThreadingMixIn: 线程模型
process_request( request, client_address) 为请求的链接创建新的线程,在创建线程时直接指定线程入口和参数:
import threading
t = threading.Thread(target = self.process_request_thread,
args = (request, client_address))
if self.daemon_threads:
t.setDaemon (1)process_request_thread() 线程处理socket入口,负责接收数据,代码实现有点绕,看看代码
def process_request_thread(self, request, client_address):
try:
self.finish_request(request, client_address)
self.close_request(request)
except:
self.handle_error(request, client_address)
self.close_request(request)ThreadingMixIn其实就是线程代理,
还是调用finish_request()进入处理tcp数据的循环,处理完成便close_request()。但是finish_request和
close_request并未在ThreadingMinxIn内定义,在哪里呢?
通过研读ThreadingTcpServer,原来通过ThreadingTcpServer这个finish_request又跑回了
BaseServer.finish_request()
ThreadingTCPServer(ThreadingMixIn, TCPServer) 装配成线程池处理的tcp服务器
BaseRequestHandler: 请求处理基础对象,提供统一的行为接口实现处理socket数据。
BaseRequestHandler比较好玩,在构造函数内完成了所有的操作,见代码: def __init__(self, request,
client_address, server):
self.request = request
self.client_address = client_address
self.server = server
try:
self.setup()
self.handle()
self.finish()
finally:
sys.exc_traceback = None # Help garbage collectionsetup()对应的子类会进行初始化处理
self.handle() 直接调用子类的处理函数,可以参考 BaseHTTPRequestHandler(SocketServer.StreamRequestHandler)::handle()
StreamRequestHandler(BaseRequestHandler) 流式socket处理类
setup() 设置好socket对象和读写文件句柄 rfile/wfile
HTTPServer(SocketServer.TCPServer) http服务器
BaseHTTPRequestHandler(SocketServer.StreamRequestHandler) 流式的请求处理类
handle() 处理入口,在基类BaseRequestHandle()的构造函数中直接调用
handle_one_request() 如果不是处理一次则返回false。接收一次socket数据,解析parse_request(),调用对应的do_xxx事件
python 的daemon线程:
如果一个进程的主线程运行完毕而子线程还在执行的话,那么进程就不会退出,直到所有子线程结束为止,如何让主线程结束的时候其他子线程也乖乖的跟老
大撤退呢?那就要把那些不听话的人设置为听话的小弟,使用线程对象的setDaemon()方法,参数为bool型。True的话就代表你要听话,我老大
(主线程)扯呼,你也要跟着撤,不能拖后腿。如果是False的话就不用那么听话了,老大允许你们将在外军命有所不受的。需要注意的是
setDaemon()方法必须在线程对象没有调用start()方法之前调用,否则没效果。
转载过来以后用
相关推荐
mod_wsgi 是一个 Apache 模块,实现了 Python WSGI 接口服务
Zappa 极大的简化了在 AWS Lambda API 网关上发布所有 Python WSGI 应用。相当于是无服务器的部署运行你的 Python Web 应用
本文主要介绍的是Python WSGI相关内容,主要来自以下网址: What is WSGI? WSGI Tutorial An Introduction to the Python Web Server Gateway Interface (WSGI) 可以看成一次简单粗暴的翻译。 什么是WSGI WSGI的...
Linux+Django+Python+Wsgi配置过程
本文中,我们就会介绍如何使用Apache模块mod_wsgi来运行Python WSGI应用。 安装mod_wsgi 我们假设你已经有了Apache和Python环境,在Linux或者Mac上,那第一步自然是安装。在Ubuntu或Debian环境中,你可以使用apt-...
切肉刀 Python WSGI 应用程序的血腥简单 A/B 测试: 在一行代码中呈现显示或行为差异。 测量和比较多个变体之间的转化,包括统计显着性。 保证回头客同样的体验。 与现有的身份验证和存储层轻松集成。 Cleaver 的...
另一个VIM设置-Python WSGI版这是我在新的WSGI开发机器上使用的设置脚本。 随意评论或编辑您认为合适的内容。安装 git clone git://github.com/mlindemu/yavs-wsgi.gitcd yavs-wsgi./yavs-wsgi.sh安装了什么? 以下...
mod_wsgi的目标是实现一个简单的Apache模块,支持任何Python WSGI的接口的Python应用程序的托管。
到Python和WSGI的端口。 使用 。 有关如何将其用于在Python中创建GraphQL服务器(具有中继支持)的演示,请参见 。 学分 该代码由Martijn Faassen移植。 执照 如何执行测试 python2.7 bootstrap-buildout.py bin/...
python2.7+Django 1.11 在windows 下部署到apache24 下可用
mod_wsgi的目标是实现一个简单的Apache模块,支持任何Python WSGI的接口的Python应用程序的托管。
mod_wsgi各版本,包括cpu架构,python版本限制。用于apache的模块组件。
我团队工作的故事之一是研究现有的Python分析工具,这些工具可用于我们的一些新Web堆栈(全部在Pylons中)。 我看了几个repoze.profile , kea.profile ,甚至dozer (仍然是0.2alpha)-但找不到适合我们用例的任何...
一个无服务器v1.x插件,用于使用无服务器构建部署的Python WSGI应用程序。 兼容的WSGI应用程序框架包括Flask,Django和Pyramid-有关完整列表,请参见: : 。 产品特点 透明地将API网关和ALB请求与标准WSGI请求之间...
Gunicorn Gunicorn'Green Unicorn'是用于UNIX的Python WSGI HTTP服务器。 这是从Ruby的Unicorn项目移植来的前叉工作模型。 Gunicorn服务器与各种Web框架广泛兼容,仅表示Gunicorn Gunicorn'Green Unicorn'是用于UNIX...
django python2 用apache部署的时候,采用mod_wsgi来启动。 What Is mod_wsgi? The aim of mod_wsgi is to implement a simple to use Apache module which can host any Python application which supports the ...
i2p-reseeder 用 Python (WSGI) 编写的 Reseeder。 它可以在所有支持 WSGI 的网络服务器下运行。 它还包含一个用于测试的内置网络服务器。依赖关系这取决于 (Python WSGI 实用程序库)。 运行apt-get install ...
Python 内置的 WSGI 服务器.py