[原创] flup源码-运行模型剖释 - python的fastcgi

本文介绍了Flup作为Python FastCGI实现与Django框架结合使用的方法。Flup支持线程和进程两种运行模型,详细解释了这两种模型的工作原理及如何通过参数配置优化服务器性能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

flup作为python的fastcgi实现,可以独立作为一个WSGI的服务,或与django结合,使用django模版、ORM进行开发。django利用其多线程或多进程的运行模型!

flup官网:http://trac.saddi.com/flup
         最终版本:1.0.3,官网最下面的publisherMiddleware 都被去掉了,只剩下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 都将直接杀死进程,不能安全退出。



 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值