摘要:
楔子 Python 编写的应用程序需要 Python 运行环境,然而,并不是所有我们想要交互的组件都是用 Python 编写的。我们可能已经使用了一个用 C++ 、Go、Rust 或其他语言编写的应用程序,这些语言提供了更好的运行时特征,或者可以提供很优秀的实现方式,而无需我们重新实现。可能还希望使 阅读全文
摘要:
楔子 在设计应用程序来处理事件或其他类型的数据时,经常需要一种机制来存储这些事件,并将它们分发给一组 worker。然后这些 worker 可根据这些事件同时执行我们需要执行的任何操作,从而节省时间。asyncio 提供了一个异步队列,可以让我们实现这一点,可将数据块添加到队列中,并让多个 work 阅读全文
摘要:
楔子 使用多线程和多进程编写应用程序时,需要考虑非原子操作时的竞态条件,因为即使是并发增加整数这样简单的操作也可能导致微妙的、难以重现的 bug。而 asyncio 是单线程的(除非与多线程和 multiprocessing 进行交互),这是否意味着我们就可以不必考虑竞争条件呢?事实证明,事情并非那 阅读全文
摘要:
楔子 许多 Web 应用程序都被构建为单体应用程序,单体应用程序通常是包含多个模块的大中型应用程序,这些模块作为一个单元独立部署和管理。虽然这种模型本质上没有任何问题(单体应用程序非常好,甚至更可取,因为它们通常更简单),但确实存在缺点。即使你对单体应用程序只进行了小幅更改,也需要重新部署整个应用程 阅读全文
摘要:
楔子 Web 应用程序为我们今天在 Internet 上使用的大多数网站提供支持,如果你曾在拥有互联网业务的公司担任过开发人员,那么你可能在职业生涯的某个阶段编写过 Web 应用程序。在同步 Python 的世界中,这意味着你使用过 Flask、Bottle 或非常流行的 Django 之类的框架。 阅读全文
摘要:
### 楔子 **在编写网络应用程序时,我们使用了 socket 库来读取和写入客户端。虽然在构建低级网络库时直接使用套接字很有效,但用法上还是有些复杂,例如启动服务端、等待客户端连接以及向客户端发送数据等等。asyncio 的设计者意识到这一点,并构建了网络流 API,这些更高级的 API 比套接 阅读全文
摘要:
楔子 在从头开始开发新的 IO 密集型应用程序时,asyncio 可能是首选技术,并且也要使用与 asyncio 搭配工作的非阻塞库,如 asyncpg、aiohttp 等等。然而我们工作的很大一部分可能是使用阻塞 IO 库管理现有的代码,例如对 HTTP 发请求的 requests,用于 Post 阅读全文
摘要:
楔子 到目前为止我们使用 asyncio 获得的性能提升,一直专注在并发运行 IO 密集型工作上面,当然运行 IO 密集型工作是 asyncio 的主要工作,并且按照目前编写代码的方式,需要注意不要在协程中运行任何的 CPU 密集型代码。但这似乎严重限制了 asyncio 的使用,因为这个库能做的事 阅读全文
摘要:
楔子 上一篇文章探讨了使用 aiohttp 库发出非阻塞 Web 请求,还讨论了使用几种不同的异步 API 来同时运行这些请求。通过结合 asyncio API 和 aiohttp 库,可以同时运行多个耗时的 Web 请求,从而提高应用程序的运行速度。但我们上一章学到的概念不仅适用于 Web 请求, 阅读全文
摘要:
楔子 在上一篇文章中,我们了解了套接字的内部工作原理,并构建了一个基本的回显服务器。现在我们将学到的知识应用到并发的、非阻塞的 Web 请求中,基于 asyncio 可以并发发送大量的 Web 请求,缩短应用程序的运行时间。当我们必须向一组 REST API 发出多个请求时,这很有用,比如在微服务架 阅读全文