子进程wsgi中间件和金字塔中间层。
subprocess_middleware的Python项目详细描述
这个包是为支持使用nodejs将Python生成的JSON呈现为HTML而构建的。 转换子流程被重用,避免了流程启动开销,并允许jit启动。 对于我们的代码,这为后续的响应提供了10倍的加速
协议简单且通用,http格式的响应(头和正文)通过管道进出转换子流程。 转换可以修改响应头和正文。
修改响应体的转换必须确保更新内容长度头以匹配。
python 2和子流程32
Python2.7中的子进程模块可能泄漏文件描述符。 python 3.x中的后端口修复程序在subprocess32中提供,如果安装了,将使用。
管道缓冲
对于较小的响应,unix命令cat用作标识转换。 一旦一个响应超过管道缓冲区限制(通常为16k或64k),就会发生死锁,两个进程都在等待另一个进程读取。 为了避免这种情况,子进程应该在写入stdout之前读入每个响应的实体,并在响应结束时刷新stdout。
要解决这个限制,需要从不同的线程进行读写。
替代品
Apache mod_ext_过滤器
使用mod_ext_filter,响应体只需通过外部程序进行管道传输。 每个响应都会启动一个新的进程,因此它与cgi受到相同的限制,在cgi中,为每个请求支付应用程序设置成本。
转换HTTP反向代理
另一种选择是将转换作为HTTP代理的一部分实现。 这增加了部署SSL所需的多个跳数的显著部署复杂性。
PYV8
PyV8允许在进程中运行JavaScript。 虽然nodejs包很容易获得,但构建起来可能很困难。
uWSGI变换
uWSGI正在为他们的转换系统开发rpc插件。 rpc协议本身有64k请求大小限制