- 前言
- 目标读者
- 非目标读者
- 本书的结构
- 以实践为基础
- 硬件
- 杂谈:个人的一点看法
- Python 术语表
- Python 版本表
- 排版约定
- 使用代码示例
- 第一部分 序幕
- 第 1 章 Python 数据模型
- 第二部分 数据结构
- 第 2 章 序列构成的数组
- 第 3 章 字典和集合
- 第 4 章 文本和字节序列
- 第三部分 把函数视作对象
- 第 5 章 一等函数
- 第 6 章 使用一等函数实现设计模式
- 第 7 章 函数装饰器和闭包
- 第四部分 面向对象惯用法
- 第 8 章 对象引用、可变性和垃圾回收
- 第 9 章 符合 Python 风格的对象
- 第 10 章 序列的修改、散列和切片
- 第 11 章 接口:从协议到抽象基类
- 第 12 章 继承的优缺点
- 第 13 章 正确重载运算符
- 第五部分 控制流程
- 第 14 章 可迭代的对象、迭代器和生成器
- 14.1 Sentence 类第1版:单词序列
- 14.2 可迭代的对象与迭代器的对比
- 14.3 Sentence 类第2版:典型的迭代器
- 14.4 Sentence 类第3版:生成器函数
- 14.5 Sentence 类第4版:惰性实现
- 14.6 Sentence 类第5版:生成器表达式
- 14.7 何时使用生成器表达式
- 14.8 另一个示例:等差数列生成器
- 14.9 标准库中的生成器函数
- 14.10 Python 3.3 中新出现的句法:yield from
- 14.11 可迭代的归约函数
- 14.12 深入分析 iter 函数
- 14.13 案例分析:在数据库转换工具中使用生成器
- 14.14 把生成器当成协程
- 14.15 本章小结
- 14.16 延伸阅读
- 第 15 章 上下文管理器和 else 块
- 第 16 章 协程
- 第 17 章 使用期物处理并发
- 第 18 章 使用 asyncio 包处理并发
- 第六部分 元编程
- 第 19 章 动态属性和特性
- 第 20 章 属性描述符
- 第 21 章 类元编程
- 结语
- 延伸阅读
- 附录 A 辅助脚本
- Python 术语表
- 作者简介
- 关于封面
18.7 本章小结
本章介绍了在 Python 中做并发编程的一种全新方式,这种方式使用 yield from、协程、期物和 asyncio 事件循环。首先,我们分析了两个简单的示例——两个旋转指针脚本,仔细对比了使用 threading 模块和 asyncio 包处理并发的异同。
然后,本章讨论了 asyncio.Future 类的细节,重点讲述它对 yield from 的支持,以及与协程和 asyncio.Task 类的关系。接下来分析了 asyncio 版国旗下载脚本。
然后,本章分析了 Ryan Dahl 对 I/O 延迟所做的统计数据,还说明了阻塞调用的影响。尽管有些函数必然会阻塞,但是为了让程序持续运行,有两种解决方案可用:使用多个线程,或者异步调用——后者以回调或协程的形式实现。
其实,异步库依赖于低层线程(直至内核级线程),但是这些库的用户无需创建线程,也无需知道用到了基础设施中的低层线程。在应用中,我们只需确保没有阻塞的代码,事件循环会在背后处理并发。异步系统能避免用户级线程的开销,这是它能比多线程系统管理更多并发连接的主要原因。
之后,我们又回到下载国旗的脚本,添加进度条并处理错误。这需要大幅度重构,特别是要把 asyncio.wait 函数换成 asyncio.as_completed 函数,因此不得不把 download_many 函数的大多数功能移到新添的 downloader_coro 协程中,这样我们才能使用 yield from 从 asyncio.as_completed 函数生成的多个期物中逐个获得结果。
然后,本章说明了如何使用 loop.run_in_executor 方法把阻塞的作业(例如保存文件)委托给线程池做。
接着,本章讨论了如何使用协程解决回调的主要问题:执行分成多步的异步任务时丢失上下文,以及缺少处理错误所需的上下文。
然后又举了一个例子,在下载国旗图像的同时获取国家名称,以此说明如何结合协程和 yield from 避免所谓的回调地狱。如果忽略 yield from 关键字,使用 yield from 结构实现异步调用的多步过程看起来类似于顺序执行的代码。
本章最后两个示例是使用 asyncio 包实现的 TCP 和 HTTP 服务器,用于按名称搜索 Unicode 字符。在分析 HTTP 服务器的最后,我们讨论了客户端 JavaScript 对服务器端提供高并发支持的重要性。使用 JavaScript,客户端可以按需发起小型请求,而不用下载较大的 HTML 页面。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论