- 内容提要
- 前言
- 作者简介
- 封面简介
- 第1章 理解高性能 Python
- 第2章 通过性能分析找到瓶颈
- 2.1 高效地分析性能
- 2.2 Julia 集合的介绍
- 2.3 计算完整的 Julia 集合
- 2.4 计时的简单方法——打印和修饰
- 2.5 用 UNIX 的 time 命令进行简单的计时
- 2.6 使用 cProfile 模块
- 2.7 用 runsnakerun 对 cProfile 的输出进行可视化
- 2.8 用 line_profiler 进行逐行分析
- 2.9 用 memory_profiler 诊断内存的用量
- 2.10 用 heapy 调查堆上的对象
- 2.11 用 dowser 实时画出变量的实例
- 2.12 用 dis 模块检查 CPython 字节码
- 2.13 在优化期间进行单元测试保持代码的正确性
- 2.14 确保性能分析成功的策略
- 2.15 小结
- 第3章 列表和元组
- 第4章 字典和集合
- 第5章 迭代器和生成器
- 第6章 矩阵和矢量计算
- 第7章 编译成 C
- 第8章 并发
- 第9章 multiprocessing 模块
- 第10章 集群和工作队列
- 第11章 使用更少的 RAM
- 第12章 现场教训
8.7 小结
当解决在现实世界中和生产系统中的问题时,常常需要和一些外部源通信。这个外部源可能是一个在另一台服务器上运行的数据库,另一个工作主机,或者一个提供了必须要处理的原始数据的数据服务。无论哪种情况,你的问题会很快变成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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论