对于线程,应用程序开发者遇到的使用场景,99% 的情况下只需知道如何派生一堆独立的线程,然后用队列收集结果。这篇文章讨论实现了 concurrent.futures.Executor 接口的类,这些类对上面这种使用场景进行了封装,使用起来特别容易,不仅能用于线程,而且还能用于进程处理计算密集型任务。同时还会介绍 future,这种对象表示异步执行的操作,类似于 JavaScript 中的 promise。
流畅的 Python 第 2 版(19):Python 并发模型
并发指同时处理多件事,并行指同时做多件事。二者不同,但有联系。一个关于结构,一个关于执行。并发用于制定方案,用来解决可能(但未必)并行的问题。并行是并发的一种特殊情况。所有并行系统都是并发的,但不是所有并发系统都是并行的。
这篇文章将展示 Python 的 3 种并发方式:线程、进程和原生协程。
流畅的 Python 第 2 版(18):with、match 和 else 块
这篇文章学习一些在其他语言中不常见的控制流功能,包括 with 语句和上下文管理器协议,匹配模式的 match/case 以及 for、while 和 try 语句中的 else 子句。
流畅的 Python 第 2 版(17):迭代器、生成器和经典协程
迭代是数据处理的基石:程序将计算应用于数据序列。如果数据在内存中放不下,则需要惰性获取数据项,即按需一次获取一项,这就是迭代器的作用。
流畅的 Python 第 2 版(16):运算符重载
一门易于使用的高级语言,再加上支持运算符重载,这或许是 Python 在数据科学领域(包括金融和科学应用程序)取得巨大成功的关键原因。这篇文章将学习 Python 的运算符重载机制。
流畅的 Python 第 2 版(15):类型提示进阶
惨痛的教训告诉我,对于小型程序,动态类型就够了,而大型程序则需要更规范的方式。如果语言能做出规范,那么当然比 放任自流 要好。这篇文章我们将继续讲解 Python 的渐进式类型系统。
流畅的 Python 第 2 版(14):继承:瑕瑜互见
这篇文章将探讨继承和子类化,重点讲解 super()、多重继承和方法解析顺序 和 混入类 等 Python 特色功能。
流畅的 Python 第 2 版(13):接口、协议和抽象基类
面向对象设计第一原则是 对接口编程,而不是对实现编程。在 Python 中,支撑一个类型的是它提供的方法,也就是接口。在不同的编程语言中,接口的定义和使用方式不尽相同。
流畅的 Python 第 2 版(12):序列的特殊方法
这篇文章将实现一个多维向量的 Vector 类。这个类的行为与 Python 中标准的不可变扁平序列一样。这篇文章还将讨论一个概念:把协议当作正式接口。我们将说明协议和鸭子类型之间的关系,以及对自定义类型的实际影响。
流畅的 Python 第 2 版(11):符合 Python 风格的对象
得益于 Python 数据模型,自定义类型的行为可以像内置类型那样自然。实现如此自然的行为,靠的不是继承,而是鸭子类型:只需按照预定行为实现对象所需的方法即可。对库或框架来说,程序员可能希望你定义的类能像 Python 内置的类一样。满足这个预期也算得上是符合 Python风格。