+-
异步 Python 比同步 Python 快在哪里?

(点击上方公众号,可快速关注)


你是否听人们说过,异步 Python 代码比“普通(或同步)Python 代码更快?果真是那样吗?


1.“同步”和“异步”是什么意思?


Web 应用程序通常要处理许多请求,这些请求在短时间内来自不同的客户端。


为避免处理延迟,必须考虑并行处理多个请求,这通常称为“并发”。


在本文中,我将继续使用 Web 应用程序作为例子,但还有其它类型的应用程序也从并发中获益。


因此,这个讨论并不仅仅是针对 Web 应用程序的。


术语“同步”和“异步”指的是编写并发应用程序的两种方式。


所谓的“同步”服务器使用底层操作系统支持的线程和进程来实现这种并发性。下面是同步部署的一个示意图:



在这种情况下,我们有 5 台客户端,都向应用程序发送请求。


这个应用程序的访问入口是一个 Web 服务器,通过将服务分配给一个服务器 worker 池来充当负载均衡器,这些 worker 可以实现为进程、线程或者两者的结合。


这些 worker 执行负载均衡器分配给他们的请求。


你使用 Web 应用程序框架(例如 Flask 或 Django)编写的应用程序逻辑运行在这些 worker 中。


这种类型的方案对于有多个 CPU 的服务器比较好,因为你可以将 worker 的数量设置为 CPU 的数量,这样你就能均衡地利用你的处理器核心,而单个 Python 进程由于全局解释器锁(GIL)的限制无法实现这一点。


在缺点上,上面的示意图也清楚展示了这种方案的主要局限。我们有 5 个客户端,却只有 4 个 worker。


如果这 5 个客户端在同一时间都发送请求,那么负载均衡器会将某一个客户端之外的所有请求发送到 worker 池,而剩下的请求不得不保留在一个队列中,等待有 worker 变得可用。


因此,五分之四的请求会立即响应,而剩下的五分之一需要等一会儿。


服务器优化的一个关键就在于选择适当数量的 worker 来防止或最小化给定预期负载的请求阻塞。


一个异步服务器的配置很难画,但是我尽力而为:



这种类型的服务器运行在单个进程中,通过循环控制。


这个循环是一个非常有效率的任务管理器和调度器,创建任务来执行由客户端发送的请求。


与长期存在的服务器 worker 不同,异步任务是由循环创建,用来处理某个特定的请求,当那个请求完成时,该任务也会被销毁。


任何时候,一台异步服务器都会有上百或上千个活跃的任务,它们都在循环的管理下执行自己的工作。


你可能想知道异步任务之间的并行是如何实现的。


这就是有趣的部分,因为一个异步应用程序通过唯一的协同多任务处理来实现这点。


这意味着什么?


当一个任务需要等待一个外部事件(例如,一个数据库服务器的响应)时,不会像一个同步的 worker 那样等待,而是会告诉循环,它需要等待什么,然后将控制权返回给它。


循环就能够在这个任务被数据库阻塞的时候发现另外一个准备就绪的任务。


最终,数据库将发送一个响应,而那时循环会认为第一个的任务已经准备好再次运行,并将尽快恢复它。


异步任务暂停和恢复执行的这种能力可能在抽象上很难理解。


为了帮你应用到你已经知道的东西,可以考虑在 Python 中使用await或yield关键字这一方法来实现,但你之后会发现,这并不是唯一实现异步任务的方法。


一个异步应用程序完全运行在单个进程或线程中,这可以说是令人吃惊的。


当然,这种类型的并发需要遵循一些规则,因此,你不能让一个任务占用 CPU 太长时间,否则,剩余的任务会被阻塞。


为了异步执行,所有的任务需要定时主动暂停并将控制权返还给循环。


为了从异步方式获益,一个应用程序需要有经常被 I/O 阻塞的任务,并且没有太多 CPU 工作。


Web 应用程序通常非常适合,特别是当它们需要处理大量客户端请求时。


在使用一个异步服务器时,为了最大化多 CPU 的利用率,通常需要创建一个混合方案,增加一个负载均衡器并在每个 CPU 上运行一个异步服务器,如下图所示:



2.Python 中实现异步的 2 种方法


我敢肯定,你知道要在 Python 中写一个异步应用程序,你可以使用 asyncio package,这个包是在协程的基础上实现了所有异步应用程序都需要的暂停和恢复特性。


其中yield关键字,以及更新的async和await都是asyncio构建异步能力的基础。


https://docs.python.org/3/library/asyncio.html


Python 生态系统中还有其它基于协程的异步方案,例如 Trio 和 Curio。


还有 Twisted,它是所有协程框架中最古老的,甚至出现得比asyncio都要早。


如果你对编写异步 Web 应用程序感兴趣,有许多基于协程的异步框架可以选择,包括 aiohttp、sanic、FastAPI 和 Tornado。


很多人不知道的是,协程只是 Python 中编写异步代码的两种方法之一。


第二种方法是基于一个叫做 greenlet 的库,你可以用 pip 安装它。


Greenlets 和协程类似,它们也允许一个 Python 函数暂停执行并稍后恢复,但是它们实现这点的方式完全不同,这意味着 Python 中的异步生态系统分成两大类。


协程与 greenlets 之间针对异步开发最有意思的区别是,前者需要 Python 语言特定的关键字和特性才能工作,而后者并不需要。


我的意思是,基于协程的应用程序需要使用一种特定的语法来书写,而基于 greenlet 的应用程序看起来几乎和普通 Python 代码一样。


这非常酷,因为在某些情况下,这让同步代码可以被异步执行,这是诸如asyncio之类的基于协程的方案做不到的。


那么在 greenlet 方面,跟asyncio对等的库有哪些?


我知道 3 个基于 greenlet 的异步包:Gevent、Eventlet 和 Meinheld,尽管最后一个更像是一个 Web 服务器而不是一个通用的异步库。


它们都有自己的异步循环实现,而且它们都提供了一个有趣的“monkey-patching”功能,取代了 Python 标准库中的阻塞函数,例如那些执行网络和线程的函数,并基于 greenlets 实现了等效的非阻塞版本。


如果你有一些同步代码想要异步运行,这些包会对你有所帮助。


据我所知,唯一明确支持 greenlet 的 Web 框架只有 Flask。


这个框架会自动监测,当你想要运行在一个 greenlet Web 服务器上时,它会自我进行相应调整,而无需进行任何配置。


这么做时,你需要注意不要调用阻塞函数,或者,如果你要调用阻塞函数,最好用猴子补丁来“修复”那些阻塞函数。


但是,Flask 并不是唯一受益于 greenlets 的框架。其它 Web 框架,例如 Django 和 Bottle],虽然没有 greenlets,但也可以通过结合一个 greenlet Web 服务器并使用 monkey-patching 修复阻塞函数的方式来异步运行。


3.异步比同步更快吗?


对于同步和异步应用程序的性能,存在着一个广泛的误解——异步应用程序比同步应用程序快得多。


对此,我需要澄清一下。


无论是用同步方式写,还是用异步方式写,Python 代码运行速度是几乎相同的。


除了代码,有两个因素能够影响一个并发应用程序的性能:上下文切换和可扩展性。


 上下文切换


在所有运行的任务间公平地共享 CPU 所需的工作,称为上下文切换,能够影响应用程序的性能。


对同步应用程序来说,这项工作是由操作系统完成的,而且基本上是一个黑箱,不需要配置或微调选项。


对异步应用程序来说,上下文切换是由循环完成的。


默认的循环实现由asyncio提供,是用 Python 编写的,效率不是很高。


而 uvloop 包提供了一个备选的循环方案,其中部分代码是用 C 编写的来实现更好的性能。


Gevent 和 Meinheld 所使用的事件循环也是用 C 编写的。Eventlet 用的是 Python 编写的循环。


高度优化的异步循环比操作系统在进行上下文切换方面更有效率,但根据我的经验,要想看到实际的效率提升,你运行的并发量必须非常大。


对于大部分应用程序,我不认为同步和异步上下文切换之间的性能差距有多明显。


 扩展性


我认为异步更快这个神话的来源是,异步应用程序通常会更有效地使用 CPU、能更好地进行扩展并且扩展方式比同步更灵活。


如果上面示意图中的同步服务器同时收到 100 个请求,想一下会发生什么。


这个服务器同时最多只能处理 4 个请求,因此大部分请求会停留在一个队列中等待,直到它们被分配一个 worker。


与之形成对比的是,异步服务器会立即创建 100 个任务(或者使用混合模式的话,在 4 个异步 worker 上每个创建 25 个任务)。


使用异步服务器,所有请求都会立即开始处理而不用等待(尽管公平地说,这种方案也还会有其它瓶颈会减慢速度,例如对活跃的数据库连接的限制)。


如果这 100 个任务主要使用 CPU,那么同步和异步方案会有相似的性能,因为每个 CPU 运行的速度是固定的,Python 执行代码的速度总是相同的,应用程序要完成的工作也是相同的。


但是,如果这些任务需要做很多 I/O 操作,那么同步服务器只能处理 4 个并发请求而不能实现 CPU 的高利用率。


而另一方面,异步服务器会更好地保持 CPU 繁忙,因为它是并行地运行所有这 100 个请求。


你可能会想,为什么你不能运行 100 个同步 worker,那样,这两个服务器就会有相同的并发能力。


要注意,每个 worker 需要自己的 Python 解释器以及与之相关联的所有资源,再加上一份单独的应用程序拷贝及其资源。


你的服务器和应用程序的大小将决定你可以运行多少个 worker 实例,但通常这个数字不会很大。


另一方面,异步任务非常轻量,都运行在单个 worker 进程的上下文中,因此具有明显优势。


综上所述,只有如下场景时,我们可以说异步可能比同步快:


  • 存在高负载(没有高负载,访问的高并发性就没有优势)

  • 任务是 I/O 绑定的(如果任务是 CPU 绑定的,那么超过 CPU 数目的并发并没有帮助)

  • 你查看单位时间内的平均请求处理数。如果你查看单个请求的处理时间,你不会看到有很大差别,甚至异步可能更慢,因为异步有更多并发的任务在争夺 CPU。


  • 4.结论


    希望本文能解答异步代码的一些困惑和误解。我希望你能记住以下两个关键点:


  • 异步应用程序只有在高负载下才会比同步应用程序做得更好

  • 多亏了 greenlets,即使你用一般方式写代码并使用 Flask 或 Django 之类的传统框架,也能从异步中受益。


  • 原文链接: 


    https://blog.miguelgrinberg.com/post/sync-vs-async-python-what-is-the-difference

    收外国男骗中国妹子的炮?天朝竟有这样一帮「女权组织」 2018-03-19 INSIGHT视界 From 酷玩实验室 微信号:coollabs 其实我读书的时候 也曾经想过做一个女权主义者 但是后来发生了一些事情 让我选择了放弃 简单来说是这么一个事情:我发现 女权对于一些中国人来说是信仰 但是对另一些中国人来说是生意 所谓的“伪女权”“女权癌” 大概就是这么回事 尽管早就有这样的思想准备 但让我没想到的是 这两天,知乎上曝光了一件大事 还是让我三观震碎 我没想到,这些“伪女权” 竟然已经形成了黑色产业链 让人细思恐极—— 国内竟然有一群人 打着“女权主义”的名号 从事着组织卖淫的事情 在中国女生不知情的情况下 把她们卖给外国男人!事情是这样的:根据知乎用户伊利丹·怒风的爆料 他在知乎和一个伪女权主义者 吵了起来 一开始,他可能以为这只是一个 脑子比较轴的伪女权主义者 所以两人就吵了一通 本来,他以为就是撕个逼而已 没想到的是 这个伪女权主义者 可不是什么好惹的主 这个自称为“玛丽女王”的人 竟然在半个月中 持续不断地骚扰他 而最夸张的是 玛丽女王声称 自己有能力 让伊利丹的QQ号 在5天之内被封掉 到这里为止 伊利丹一直以为 他不过是碰到了一个杠精 但是万万没想到 5天之后 他的QQ号竟然真的被永久封禁了!说真的,这就有点吓人了 这个不起眼的玛丽女王 竟然还能操控别人的QQ账号被封?难不成,她真的背后有人?伊利丹这才意识到 自己好像惹到了一个组织 他去扒了扒这个玛丽女王的QQ空间 这才发现 自己简直捅出一个马蜂窝:这个人平时干的 竟然是把中国女生 卖给外国男人的皮肉生意!真的,我本来以为 我是一个见过不少套路的人 但没想到 这一套操作 真的是惊为天人 简单来说是这样的 首先,玛丽女王自称是“女权主义者” 但是实际上她的言论 宣传的却是 中国男人配不上中国女人 她甚至恶意辱骂中国男人 恨不得中国男人全部死光 连自己的爸爸都不放过 但是,这么做对她有什么好处呢?很简单 骂完中国男人以后 接下来她就说—— 既然中国男人这么差劲 那就找外国男人吧!于是,她就经常发布外国男人的介绍 看起来是一个热心的媒婆 还在各种QQ和微信群里 散播此类信息 但是看到这里 我们不难发现有点问题 看看其中这些不堪入目的措辞 这并不是普通的介绍男友啊!这简直是在拉皮条啊!果然,伊利丹发现 玛丽女王真的在 拉皮条的过程中 收外国男人的钱!下面是聊天记录实锤:而且,请注意—— 在这个过程中 她会收外国男人的钱 但是钱不给中国女生 却落到了她自己的腰包 于是一个诡异的情况出现了:中国妹子 并不知道收钱这回事 还以为是正常交友 而外国男人 却都交了钱 很可能认为自己是在买春!额,也就是说 在中国女孩不知情的情况下 她们被“卖”给了外国男人 而好处费 却全都进了玛丽女王的腰包... 我真的是没见过这种操作 这说轻了是骗炮 说重了,已经可以算是卖淫了吧?我想请熟悉刑法的朋友们看看 这个玛丽女王 至少应该算是个 介绍组织卖淫罪吧?而且,从伊利丹曝光的资料看来 这个组织规模不小 玛丽女王甚至把外国男生的信息 建了一个完整的表格 有详细的个人资料、照片 可以说 是一条非常完整的产业链 那如果按照这样操作 外国男人都是来嫖的 中国女生却不知道 还以为是要跟他们谈恋爱 那双方难道不会穿帮吗?恩,在这方面 玛丽女王早有对策 根据知乎一位 从事过这个产业的匿名用户提供的信息 针对这种情况 玛丽女王们 还会手把手地教外国男人 怎么快速摆脱女生的纠缠 怎么调教中国女生 怎么让女生觉得自己很可爱 可以说 各种套路一应俱全 甚至还可以开发票!看到这里 她们背后的产业就非常清楚了 这个玛丽女王 她根本就不是什么女权主义者 而是打着女权主义的口号 贩卖中国女生的人贩子 一方面 她们通过辱骂中国男人 吸引对外国男人感兴趣的中国女生 另一方面 她们向外国男人收钱 然后把中国女生卖给他们!图片来源:知乎@渭水徐工 而可怜的中国妹子们 还以为自己是在 追求男女平权 其实,不过是沦为了 这些老鸨的赚钱工具 伊利丹把这整个事情 写出来以后 在知乎、微博引起了巨大的关注 关于其中提到的 伊利丹的QQ被永久封禁的问题 腾讯经过核查 目前也有了结果:经调查,是玛丽女王利用伪造证据 恶意举报了伊利丹的QQ号 目前,腾讯已经将伊利丹的QQ解封 同时封禁了玛丽女王等人的 两个QQ账号 警方也就此事立案侦查了 相信很快就会有结果 这个事情算是告一段落了 但是在我看来 却有一件事让我无法释怀:为什么“女权主义”竟然会和 辱骂中国男性等同起来?为什么“和外国男人交友” 竟然还能演变成 一个免费的陪睡组织?我想,这个玛丽女王 也许只是一个 发现了恶性赚钱模式的生意人 但是在这背后隐藏的 其实是一个很深的问题:为什么有不少中国女人 越来越看不上中国男人 甚至觉得嫁给外国男人 是一种时尚?这里面的原因可能非常复杂 我这里先提供一个思路 供大家讨论:我发现 现在中国很多大型的女权组织 背后都有着西方势力的影子 她们打着女权的名号 为自己谋取暴利 为西方国家从事破坏活动 而那些真正为女性平权而奔走的人 却得不到应有的帮助 我之所以这样说 并不是信口开河 而是有充足的证据 有一个非常有名的民间女权组织 叫做“女权之声” 它一再声称 自己只是一个自发的民间组织 致力于促进男女平等的 它所有的微博账号、微信账号 全部都是由一个 叫做妇女传媒监测网络的创办的 而这个妇女传媒监测网络 有这么多媒体产品 那它的钱都是哪里来的呢?从她们介绍的合作组织里 我们可以清楚地找到 她们的资助者—— 竟然有西方的福特基金会 有人也许会问 收了西方的钱怎么了?中国的组织不能收西方的钱吗?然而,她们不只是收了西方的钱而已 女权之声组织里 有一个人叫做郑楚然 她除了女权运动之外 没有任何其他工作 表面上,是一个全职的女权工作者 在2015年的时候 她还因为寻衅滋事 被警察拘留过30多天 甚至在她被拘留的时候 希拉里还借题发挥 指责中国侵犯人权、压制民主 一个中国的小小民间组织的首领 在互联网上的粉丝还没有我多 竟然能得到希拉里这个级别的关注?我真的是惊掉了下巴 这样看来 我离希拉里也不是很远了??而不止是希拉里 这样一个明明思想上毫无建树的人 却被西方媒体BBC评为了 全球百大思想家 图:郑楚然在王宝强事件中发表的言论 除此以外 更让人匪夷所思的 是她们平时就喜欢攻击政府 甚至于,她们还会试图分裂我们国家 比如,女权之声这个组织里 著名的女权斗士洪理达 就曾经转发著名的港独媒体 Hong Kong Free Press的言论 甚至曾公开发表过 支持藏独、港独、台独的言论 她也经常和郑楚然混在一起 我很想不通 如果她们真的只是单纯的女权主义者 为何要发表分裂国家的言论?为何要支持藏独、港独、台独?我只能说,这大概就叫 拿人家的手短,吃人家的嘴软吧 以前,我在接触中国的女权组织时 我就觉得很奇怪 她们都喜欢声称 自己是不盈利的非政府组织 但是她们无论是宣传 还是组织各类活动 都需要大量的钱 如果她们真的不盈利 那这些钱都是哪里来的呢?而这些外国的金主 他们也更加不可能是什么慈善组织 大发善心来给中国人投钱 每一分投出去的钱 一定都是要有回报的 那么,他们的回报是什么呢?他们给中国的“女权组织”投钱 能得到什么利益呢?联想到中国网络上 如火如荼的对中国男人的讨伐 我只能说,细思恐极 我绝不是危言耸听 因为我们就看不远的邻国日本 近些年来日本对于西方的崇拜 可谓深入骨髓 已经到了崇洋媚外的程度 而这其中 当然也包括对白人男性的崇拜 甚至在2016年一个瑞士白人 发了一个视频,赤裸裸的说 “在东京,只要你是白人, 做什么都可以” 视频里面他在日本便利店 随意的亲吻不认识的收银员女孩 在酒吧把不认识的日本女孩 按向自己的裤裆 而日本女孩回应的却是谄媚的笑容 我想,并不会有那么多中国人 真正被西方伪女权主义控制 但是,我们要警惕的是 别在你自己都没有察觉的时候 被别有用心的人洗了脑 更有甚者 别在你自己都不知道的情况下 被别人卖给了外国男人 还去帮他数钱 本文系授权发布,From 酷玩实验室,微信号:coollabs,欢迎分享到朋友圈,未经许可不得转载,INSIGHT视界 诚意推荐 Forwarded from Official Account 酷玩实验室 酷玩实验室 Learn More Scan QR Code via WeChat to follow Official Account 采集文章采集样式近似文章查看封面