返回介绍

8.7 小结

发布于 2024-01-25 21:44:08 字数 1323 浏览 0 评论 0 收藏 0

当解决在现实世界中和生产系统中的问题时,常常需要和一些外部源通信。这个外部源可能是一个在另一台服务器上运行的数据库,另一个工作主机,或者一个提供了必须要处理的原始数据的数据服务。无论哪种情况,你的问题会很快变成I/O密集型,意味着对输入/输出的处理占据了大部分运行时间。

并发通过允许你把潜在的多个I/O操作交织起来,从而有助于I/O密集型的问题。这样就允许你探索I/O和CPU操作的基本区别来提升整体的运行时间。

就如我们看到的那样,gevent为异步I/O提供了最高级别的接口。另一方面,tornado让你手动控制事件循环的运行,允许你使用事件循环来调度你想要的任何类型的任务。最后,在Python 3.4+中的asyncio允许完全控制一个异步I/O栈。除了各种各样的抽象级别,每个库为它的语法使用了一个不同的范型(差异主要源于在Python 3以前缺乏对并发的原生支持以及引入了yield from声明)。我们推荐从这一系列方法中去获取经验,并基于需要多少低层控制来挑选其中一个。

最后,我们采用过的这3个库中有轻微的速度差异。这些速度差异很多都是基于协程的调度方式。例如,tornado做了一件极好的工作来快速启动异步操作并快速让协程继续运行。另一方面,尽管asyncio看上去运行得稍微糟了一点,但是它允许访问更低层的API,并能够动态调整。

在下一章中,我们会采用这个来自于I/O密集型问题的交织计算的概念,并把它应用于CPU密集型问题。使用了这个新的力量,我们将不但能够同时运行多个I/O操作,而且也能够同时运行许多计算型的问题。这种能力将允许你开始创建完全可扩展的程序,在其中,我们可以通过仅仅增加更多的能够分别处理分块问题的计算资源来获得更多的速度提升。

[1] 对于一些数据库,比如Redis,这是一个专为维护数据一致性所做出的设计抉择。

[2] 例如,fuggetaboutit是一种特殊类型的概率数据结构(请看11.6节)来使用tornado IOLoop调度时间任务。

[3] Python增强协议(PEPs)是Python社区对于如何变化和如何推进语言的决定。因为它是标准库的一部分,asyncio将总是遵守语言的最新PEP标准并且利用任何最新的特性。

[4] 大多数性能应用程序和模块还是在Python 2.7的生态系统中。

[5] 这不是必要的,它只是简化了我们的代码。

[6] 这对所有的分布式数据库和其他流行的数据库都成立,比如Postgres、MongoDB、Riak等。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文