免责声明:这一系列文章并非旨在提供有关Python中异步API的完整信息;它只试图显示理解python中异步特征的逻辑流。因此,我会处理解释详细信息或可用的API或语法列表(例如,with with with with with with async或async)。
为什么我有(并且有)知道异步?
就像其他开发人员一样,这是JavaScript。
自从我从事软件工程师职业生涯以来,术语异步一直在不断出现。您会穿上我的鞋子,特别是如果您是网络开发人员。例如,在JavaScript/node.js中,您甚至可以在不使用async… await…
语法的情况下编写一个应用程序。不仅是JS的情况 - 您如今可以看到C#,Rust和Python等任何地方。
但是,尽管我认为js中的async
语法是理所当然的,但Python中的async
在我第一次看到它时对我很不熟悉。我有一些使用Python编写非常简单的脚本的经验,而不必担心这些异步功能。这可能是因为许多大型流行的图书馆,例如numpy,pandas,甚至selenium都不需要考虑任何异步逻辑。这些图书馆是(现在仍然是)完全使用Python的主要原因。
为什么我想知道python中的异步?
但是,在我加入当前公司并开始使用FastAPI之后,我不得不在Python中使用该async
功能,尽管我真的不需要了解这些语法的含义 - 我只猜到他们是反应的几乎就像JS/Node.js中的那些一样。那是非常正确的,一切都很好。
但是,随着我对Python的了解更多,并尝试在内部进行更深入的挖掘,因此不可避免地要了解它在内部的工作方式,尤其是当您对并行计算和并发编程等高级功能感兴趣时。作为一个有抱负的工程师,想创造自己的东西,我了解了Python的async
事物。
关于这一系列文章
我从没想过这个话题已经成为一系列文章。我对Python中异步功能的了解越多,我不得不考虑本质上相关的部分。
Coroutine和Generator
基本上,我所有的问题始于该async def
语法,该语法产生了一个coroutine对象。但是什么是Coroutine?我知道,这当然是一种编程模式。而且它也不存在于Python中。但是,即使我经常听说过它,我还是真的想看看它是如何实现的 - 我真的不想阅读一个Wikipedia页面,而忘记了实际的代码。
,但这意味着我不得不搜索相关的概念,这归结为发电机。但是发电机本身根本不是一个容易的概念。但是,这是理解Coroutine对象的核心概念,因此我别无选择,只能研究此功能。
(本地)Coroutine和Asyncio库
弄清楚什么是故事的结尾。事实证明,它只是一个接口,详细信息应由程序员填写。这样的例子之一是asyncio library。它使用Coroutine对象的行为来实现其自己的异步API功能。在此阶段,我深入研究了库的基本特征,例如事件循环,未来和任务。
该系列的内容
总的来说,该系列就是这样:
- 发电机作为迭代器
- 发电机作为Coroutine
- 本地Coroutine
- 异步功能 - 事件循环
- 异步功能 - 任务和未来
推荐的材料
也许这是我缺乏在互联网上搜索材料的技巧,但是其中许多没有提供我想要的信息 - 其中很少有细节,而许多事情只是显示了它可以使用玩具代码示例。这就是为什么我花了很长时间才能弄清楚异步在Python中工作的另一个原因。
但是,我并不是说那里有任何好的材料。如果您对此主题感兴趣,我想推荐以下材料列表。也许您甚至真的不需要查看这个系列!
-
对于那些几乎不了解异步事物的人,我强烈建议您通过tutorial in the FastAPI documentation阅读。它非常直观且易于理解。如果您想要更多的编码,也许您想要trio tutorial。尽管我们在本系列中涵盖了三重奏库,但任何异步库的高级别功能几乎是相同的,因此您可以简要了解本教程中Python实际上如何编写异步功能。
-
如果您已经在使用Python(或JS)中使用这些异步功能的经验,我建议您阅读有关此主题的一些书籍。我最喜欢的Dead Simple Python或圣经Fluent Python之一是很好的阅读。我个人认为,简单会更容易,但是我发现流利的'也很清晰,易于理解,许多真实的例子。
-
要了解Asyncio库的内部结构,对我阅读本文确实很有帮助:“500 Lines or Less: A Web Crawler With asyncio Coroutines”。我碰巧在浏览Cpython文档时发现了这篇文章。它深入探讨了发电机的工作原理及其与Coroutine概念的关系。此外,它还显示了一些低级功能,例如选择器和期货,这确实启发了我研究Asyncio库的实际源代码。尽管这是有点古老的文章,但我仍然发现阅读真的很有趣。
-
series created by an engineer who participated in a BBC cloud project是series created by an engineer who participated in a BBC cloud project的一般结构的另一项很好的阅读。它概述了Asyncio功能的整体大图,它确实帮助我了解了这些功能如何以无缝的方式一起工作。
-
要了解发电机与Coroutines之间的关系,阅读this article by one of the main contributors of CPython或a supplement of Fluent Python将阐明经典的Coroutine是什么。
结论
这将是一段漫长的旅程,尽管我从没想到会这样。我决定不介绍一些遗漏的东西,但我会尽力包括基本零件。