转自: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操作 RabbitMQ、Redis、Memcache、SQLAlchemy

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

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

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

  3. 十一天 python操作rabbitmq、redis

    1.启动rabbimq.mysql 在""运行""里输入services.msc,找到rabbimq.mysql启动即可 2.启动redis 管理员进入cmd, ...

  4. Python操作memcached及redis

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

  5. 17.Python笔记之memcached&redis

    作者:刘耀 博客:www.liuyao.me 博客园:www.cnblogs.com/liu-yao 一.Memcached 1.介绍 Memcached 是一个高性能的分布式内存对象缓存系统,用于动 ...

  6. Python之路【第九篇】:Python操作 RabbitMQ、Redis、Memcache、SQLAlchemy

    Python之路[第九篇]:Python操作 RabbitMQ.Redis.Memcache.SQLAlchemy   Memcached Memcached 是一个高性能的分布式内存对象缓存系统,用 ...

  7. Python自动化运维之17、Python操作 Memcache、Redis、RabbitMQ

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

  8. Python 之路:Python操作 RabbitMQ、Redis、Memcache、SQLAlchemy

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

  9. Python操作MongoDB和Redis

    1. python对mongo的常见CURD的操作 1.1 mongo简介 mongodb是一个nosql数据库,无结构化.和去中心化. 那为什么要用mongo来存呢? 1. 首先.数据关系复杂,没有 ...

随机推荐

  1. Android API之Telephony.Threads

    1. Telephony.ThreadsColumns Columns for the "threads" table used by MMS and SMS. 在Telephon ...

  2. E325 注意 发现交换文件

    git中的 交换文件应该是保持当前git的session的一种文件. git中,如果出现这个有两种原因: 1.你开了两个git客户端对同一个git仓库进行了操作.如果是这样的话,退出一个.正常退出,不 ...

  3. libevent终于编译通过了

    在网上找了个例子,其实libevent本身带了很多测试用例,不过这是第一次编译成功,尼玛 各种高性能IO库都是在linux下的,win32果断被bs了,还好有libevent对win32支持的比较好. ...

  4. 阿里面试的一点感受 阿里ali片式经历和面试题

    阿里面试的一点感受 <!-- [废话开始] 百度实习三个月,明天就要离职了,感觉还挺开心的,同事们都很照顾我,Boss也比较欣赏我,我很满足了.掐指一算,这大四其实也没几个月了,同事们都在感叹大 ...

  5. C++ map,set内部数据结构

    1)Set是一种关联容器,它用于存储数据,并且能从一个数据集合中取出数据.它的每个元素的值必须唯一,而且系统会根据该值来自动将数据排序.每个元素的值不能直接被改变.[重点]内部结构采用红黑树的平衡二叉 ...

  6. openstack网络基础

    一.概述 网络虚拟化是云计算的最重要部分,本文详细讲述 Linux 抽象出来的各种网络设备的原理.用法.数据流向.您通过此文,能够知道如何使用 Linux 的基础网络设备进行配置以达到特定的目的,分析 ...

  7. 【MySQL】MySQL之MySQL常用的函数方法

    MySQL常用函数 本篇主要总结了一些在使用MySQL数据库中常用的函数,本篇大部分都是以实例作为讲解,如果有什么建议或者意见欢迎前来打扰. limit Select * from table ord ...

  8. C++转型操作符

    转:http://www.cnblogs.com/hazir/archive/2012/04/14/2447251.html 旧式的C转型方式,几乎允许你将任何类型转换为任何其它类型,有其自身的缺陷, ...

  9. centos 6&7 升级openssh

    1.查看现在的版本 # rpm -qa | grep openssh openssh-clients-6.6.1p1-22.el7.x86_64 openssh-server-6.6.1p1-22.e ...

  10. Debian下的crontab保存

    nano编译器 ctrl+x然后y,保存退出