flup作为python的fastcgi实现,可以独立作为一个WSGI的服务,或与django结合,使用django模版、ORM进行开发。django利用其多线程或多进程的运行模型!
flup官网:http://trac.saddi.com/flup
最终版本:1.0.3,官网最下面的publisher 与Middleware 都被去掉了,只剩下server,clent
文档: 没有,官方说源码就是最好的文档。
先看看django启动为fastcgi模式参数 :
这主要解释下flup运行模型: 线程(thread) 或 进程(prefork只支持lunix)
- 线程模型 method=threaded
1)线程池:flup.threadpool.py文件:
这里节选两个函数, 初始化时线程池把空闲线程维持在 minSpare与maxSpare之间,最大线程数 上限为maxThreads,这里看下django启动参数一致.
这线程池好东西阿,装flup库,写其它python多线程或异步的程序也可以引入使用,只要实现自己的MyJob类,直接调用addJob即可:
因为python本身并非真正的多线程,这个线程模并不是我程序最终选择的,尽管测试中发现它非常高效,省去了线程的创建、销毁。另外,另一个组在使用线程模型时,出现不稳定,运行久了时不时500。
线程模型可以直接使用kill -HUP 主进程PID进行安全退出,其使用 线程的join等待进程退出。 -TERM也行,-9你就悲剧了!
- 进程模型 method=prefork
进程要来得复杂,但最终运行时,稳定一些!内存与CPU都能用尽。
主要看flup.prefrokserver.py文件 PreforkServer 类。其使用linux的标准fork函数进行多进程的派生,每个派生出来的子进程都变成了单线程。只能在运行时进程线程创建!fork特性详看: http://www.opengroup.org/onlinepubs/000095399/functions/fork.html
想创建为多线程 + 多进程的 fastcgi,看我的另一文章。
贴一个退出函数,当我们向主进程PID发出kill -HUP PID时,PreforkServer类调用以下函数,向每一个子进程发送一个中断信号SIGINT=2, 再等待10秒,注册一个alrm。子进程必需注册SIGINT信号,不然python虚拟机 将调用默认的键盘中断,子进程如正在处理HTTP请求,会异常中断!你就等着事务数据出乱吧!
多进程下注册自己的中断处理函数:
父进程与子进程之间使用非阻塞的sock对进程通信
flup只处理了 kill -HUP, -TERM 退出信号; -QUIT, -9 都将直接杀死进程,不能安全退出。