然而事情并不总是那么完美 , 有时候请求需要耗费很长时间去处理 , 等待完成的过程增加了不必要的延迟 。
当我们做优化时 , 有必要考虑系统调用的成本和请求的预期完成时间 。

文章插图
经过优化 Japronto 拿到了 1,214,440 RPS 的成绩
除了利用客户端流水线请求 , 和优化调用 , 还有一些其它可用的技术 。
Japronto 几乎都是用 C 写的 。包含解析器、协议、链接管理、路由、请求、应答等对象都是用 C 扩展写的 。
Japronto 力图做到 Python 的懒加载 , 比如 , 协议头的字典只有在被试图请求到时才会被创建 , 另外一系列的对象也只有在第一次使用时才会被创建 。
Japronto 使用超牛逼的 picohttpparser C 库来解析状态、协议头以及分片的 HTTP 消息体 。Picohttpparser 是直接调用现代 CPU 集成的 SSE4.2 扩展文本处理指令去快速匹配 HTTP 标记的边界(那些 10 年前的老 x86_64 CPU 都有这玩意儿) 。I/O 用到了超棒的 uvloop , 它是一个 libuv 的封装 , 在最底层 , 它是调用 epoll 来提供异步读写通知 。

文章插图
Picohttpparser 依赖 SSE4.2 和 CMPESTRI x8664 的特性做解析_
Python 是有垃圾收集功能的语言 , 为避免不必要的增加垃圾收集器的压力 , 在设计高性能系统时一定要多加注意 。Japronto 的内部被设计的尝试避免循环引用和尽可能少的分配、释放内存 , 它会预先申请一块区域来存放对象各种 , 同时尝试在后续请求中重用那些没有被继续引用的 Python 的对象 , 而不是将那些对象直接扔掉 。
这些预先申请的内存的大小被固定为 4KB 的倍数 。内部结构会非常小心和频繁的使用这些连续的内存区域 , 以减少缓存失效的可能性 。
Japronto 会尽可能避免不必要的缓存间复制 , 只在正确的位置执行操作 。比如 , 在处理路由时 , 先做 URL 解码再进行路由匹配 。
开源贡献者们 , 我需要你们的帮助我已经连续不断的开发 Japronto 超过三个月 , 不光在每一个工作日 , 周末也无休 。除了每天的工作外 , 我把所有时间精力都投入到这个项目上了 。
我想是时候和社区分享我的劳动果实了 。
Japronto 已经可靠的实现了下面这些功能:
- 实现 HTTP 1.x 并且支持分片上传
- 完整支持 HTTP 流水线
- 可配置是否让链接 Keep-alive
- 支持同步和异步视图
- Master-multiworker 多任务处理
- 代码热加载
- 简单易用的路由规则
写文档和做测试还有许多工作要做 , 如果你有兴趣加入我 , 请在 Twitter 上直接联系我. 这里是 Japronto 的 GitHub 项目仓库.
同时 , 如果你的公司正在寻找熟悉性能优化和 DevOps 的 Python 工程师 , 我很乐意为你效劳 , 在全球任何地方都可以 。
结束语上面提到的所有技术不只适用于 Python , 也同样可以被应用到其它语言 , 如 Ruby、JAVAScript , 甚至 php 等 。我非常感兴趣去付诸实践 , 但是 , 除非有人能在这事上投入资金支持 , 恐怕我没有足够的精力去完成 。
在此我要感谢 Python 社区为优化性能所付出的持续投入 。尤其是 Victor Stinner @VictorStinner、INADA Naoki @methane 和 Yury Selivanov @1st1 以及整个 PyPy 团队 。
献给我挚爱的 Python 。
推荐阅读
- 城湖茶叶加盟信息,加盟白茶费用
- 华为路由交换设备连接管理及常用配置命令
- 定速巡航怎么用?
- 淘宝旺铺收费吗 淘宝旺铺专业版费用是多少钱一个月
- 罗盘的使用 选择什么样的罗盘最常用
- 女生用哑铃锻炼多少磅合适
- 淘宝开店前期需要准备多少资金 淘宝开网店步骤和费用
- 胸肌锻炼家庭版真的有用吗
- 淘宝开直通车的详细步骤 淘宝直通车怎么使用教程
- 茶花粉的功效作用,茉莉毛尖属于什么茶茉莉花茶毛尖的功效与作用
