转自:http://mp.weixin.qq.com/s?__biz=MjM5NzU0MzU0Nw==&mid=2651374524&idx=1&sn=d289aa7aa484d0485489b9e63a56ff8a&chksm=bd2408a88a5381bea9f854376ecb96f5aab056d2dc203142df10a42b238b695e42928256b0ce&mpshare=1&scene=23&srcid=0503WYobyoHUL7QCB8Pw2K3j#rd


人们对于Python和其他解释型语言(例如:Ruby,JavaScript,PHP,Perl等等),最常抱怨的就是他们太慢了。显然,网络应用中,速度更快的语言能够实现更短的响应时间以及降低服务器的消耗。

为了解决这样的问题,Python3.4引入了asyncio模块,随后,Python3.5则为它设计了新的语法。然后,随之而来的uvloop网络库为asyncio带来了速度上的极大提升:

uvloop使得asyncio相当快。实际上,和nodejs,gevent以及任何其他Python中的异步网络架构相比,asyncio的速度至少是它们的2倍,基于uvloop的asyncio在性能上的表现已经接近于Go语言了。

在Paxos(译者注:一种基于消息传递的一致性算法)中,我们大量使用asyncio,既是因为它的性能更好,也是因为asyncio更加适合我们整体架构。我们的产品与来自不同的客户端的事务数据同步,同时,因为它是一个分布式系统,所以本质上讲,它又是异步的。

asyncio能够出色地将吞吐量最大化,但是我们也关心要减少延迟。就延迟而言,你的数据库本身会是一个主要的瓶颈。实践中,当我们使用例如合适的索引,或者固态磁盘这些最佳方法时,一个大约10ms响应时间的数据库查询被认为是效果不错的。

当然,RAM要比asyncio要快几个数量级,但是简单的"key-value"型的存储结构,并不能实现软件工程师们所常常依赖的许多特性。比如,多索引和基本类型检测是非常有用的,也最好能有像"ORDER BY","LIMIT"和"OFFSET"这些功能。

此外,Redis的性能、高级特性及其文档,已经给我们留下了非常深刻的印象。所以我们写了一个可被Redis支持的对象映射器:"subconscious",它依赖于asyncio和Redis的强大原语。使得你能以RAM的性能利用数据库,这就像是一个SQLAlchemy的精简版(不支持"JOIN"操作)。

  • 译者注:Redis:一个key-value存储系统

  • 译者注:SQLAlchemy:Python编程语言下的一款开源软件。提供了SQL工具包及“对象关系映射”工具,使用MIT许可证发行。

你可以如下定义一个模型(更多细节请查阅 official repo):

然后,你可以查询和使用你的这个模型:

你也会找到很多你期望在传统的ORM中有的功能。下面是如何向一个满足属性:{US, college-age, male}的用户发一个推送的过程:

  • 译者注:ORM:对象关系映射

为了证明在实际中这个工具(subconscious)是多么强大和方便使用,我们把一个类似Pastebin的网站和大约100行代码放在了一起。

  • 网站URL:http://52.170.82.45/

  • 源代码:https://github.com/paxos-bankchain/pastey

我们用Microsoft Azure中最廉价的应用实例(称作F1,拥有1核处理器以及2GB的RAM)上加载和测试了这个APP,结果数据是很漂亮的:

  • 大约41秒内发送了10000次页面请求

  • 页面响应时间的中位数大约是19毫秒

  • 大约22毫秒内,90%的页面做出了服务响应

Redis可以保存在磁盘上,但是对比传统的数据库,它的持久性更弱。同时,它的事务和回滚很复杂,而且对于及数据完整性,几乎没什么保证。一些常见的用例如下:

  • 可以从日志中重播的临时数据(所以持久性不是大问题)

  • 频繁更新的数据:写入RAM比写入磁盘要快得多

  • 当延迟是非常重要的考虑因素时

  • 当相同的数据被定期查询,同时数据的容量很低,以及/或者你有很充足的硬件预算时

对于低吞吐量的应用或者适用于水平缩放的应用来说,这些特性可能无法提供让人兴奋的充足的优势。但是对于高吞吐量的应用来说,延迟对它们有着不可忽略的影响,那么,这种性能的提升就存在着重大的价值。

Subconscious是使用MIT许可证发行的开源工具,所以你可以自由地在你自己的项目中使用它。

英文原文:https://eng.paxos.com/write-fast-apps-using-async-python-3.6-and-redis 
译者:guoziqing

(转)使用异步Python 3.6和Redis编写快速应用程序相关推荐

  1. 用python做一个木马_Python编写简易木马程序

    light · 2015/01/26 10:07 0x00 准备 文章内容仅供学习研究.切勿用于非法用途! 这次我们使用Python编写一个具有键盘记录.截屏以及通信功能的简易木马.依然选用Subli ...

  2. Python操作 RabbitMQ、Redis、Memcache、SQLAlchemy

    Memcached Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态.数据库驱动网站的速度 ...

  3. 为什么异步Python比同步Python快?

    在本文中,我将继续使用 Web 应用程序作为例子,但还有其它类型的应用程序也从并发中获益.因此,这个讨论并不仅仅是针对 Web 应用程序的.你是否听人们说过,异步 Python 代码比"普通 ...

  4. Python 基于python+mysql浅谈redis缓存设计与数据库关联数据处理

    基于python+mysql浅谈redis缓存设计与数据库关联数据处理 by:授客  QQ:1033553122 测试环境 redis-3.0.7 CentOS 6.5-x86_64 python 3 ...

  5. python实现异步的几种方式_终于搞明白了,异步Python比同步Python究竟快在哪里?...

    大家好,你是否听人们说过,异步 Python 代码比"普通(或同步)Python 代码更快? 果真是那样吗? 同步和异步是什么意思? Web 应用程序通常要处理许多请求,这些请求在短时间内来 ...

  6. python操作redis实例_Java,php,Python连接并操作redis实例

    1.Java连接并操作redis 在Eclipse里新建一个java project,导入jedis-*.jar包. 示例代码,其他对应的操作类型见:http://my.oschina.net/u/2 ...

  7. python文本框与数据库的关联_Python 基于python+mysql浅谈redis缓存设计与数据库关联数据处理...

    基于python+mysql浅谈redis缓存设计与数据库关联数据处理 by:授客 QQ:1033553122 测试环境 redis-3.0.7 CentOS 6.5-x86_64 python 3. ...

  8. 5个异步Python框架

    1.Tornado Tornado 根本不是什么新框架,它最初是由FriendFeed(后被Facebook收购)在2009年发布.从一开始就提供有异步编程的功能. Tornado 不仅仅是Web框架 ...

  9. python 异步数据库_异步Python和数据库

    python 异步数据库 The asynchronous programming topic is difficult to cover. These days, it's not just abo ...

最新文章

  1. 【Python3 爬虫】03_urllib.error异常处理
  2. Ansible script模块使用示例
  3. iframe js 加载失败_如何提高Vue项目首页的加载速度
  4. 黑马程序员-代理类的作用与原理及AOP
  5. 《程序设计技术》第八章例程
  6. 如何巧妙使用Camtasia库中的素材?
  7. 手机应用的照相录像功能,为什么转到后台就不能工作了?
  8. 华为s5500t服务器硬盘,HuaweiOceanStor1T SAS 7.2K3.5寸WD1003FBYXS5500T存储硬盘
  9. 苹果无法安装app_APP做了ios企业签名后无法安装?原因有这些
  10. java rar解压
  11. Xposed Xposed插件开发
  12. 用户参与度与活跃度的区别_如何使用色彩理论提高用户对应用程序的参与度
  13. MATLAB画心形立体图
  14. 计算机考试用到的英语词汇,BEC商务英语_计算机英语高级词汇·软件篇_沪江英语...
  15. 女生回你微信忽快忽慢,掌握这5个技巧和3个开场白,让她秒回你
  16. git可视化工具gitg和SmartGit
  17. Python爬一爬世界杯赛程
  18. [荐]没羽箭张清到底连打梁山多少好汉?
  19. wifi流程详细分析
  20. 还不会正则表达式? 放心 我会出手(万字教学)

热门文章

  1. 兽语狗语文字在线加密解密PHP网站源码
  2. 万能客服公众号版-聚合客服小程序功能模块V28.1.0
  3. 这部计算机27厘米宽英语怎么说,24/27/32寸电脑显示器尺寸多大?长宽多少厘米?显示屏长宽与面积的算法...
  4. WEB-INF下jsp页面如何访问
  5. php计算器等号没反应,为什么按等号没有反应?
  6. python安装第三方库-常见错误解决
  7. WPF中的事件及冒泡事件和隧道事件(预览事件)的区别
  8. 漫步ASP.NET MVC的处理管线
  9. 用dynamic增强C#泛型表达力
  10. WebBrowser部分用法