[Python]前往Python Async的旅程-1。简介
#网络开发人员 #python #网络

免责声明:这一系列文章并非旨在提供有关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编写非常简单的脚本的经验,而不必担心这些异步功能。这可能是因为许多大型流行的图书馆,例如numpypandas,甚至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中工作的另一个原因。

但是,我并不是说那里有任何好的材料。如果您对此主题感兴趣,我想推荐以下材料列表。也许您甚至真的不需要查看这个系列!

  1. 对于那些几乎不了解异步事物的人,我强烈建议您通过tutorial in the FastAPI documentation阅读。它非常直观且易于理解。如果您想要更多的编码,也许您想要trio tutorial。尽管我们在本系列中涵盖了三重奏库,但任何异步库的高级别功能几乎是相同的,因此您可以简要了解本教程中Python实际上如何编写异步功能。

  2. 如果您已经在使用Python(或JS)中使用这些异步功能的经验,我建议您阅读有关此主题的一些书籍。我最喜欢的Dead Simple Python或圣经Fluent Python之一是很好的阅读。我个人认为,简单会更容易,但是我发现流利的'也很清晰,易于理解,许多真实的例子。

  3. 要了解Asyncio库的内部结构,对我阅读本文确实很有帮助:“500 Lines or Less: A Web Crawler With asyncio Coroutines”。我碰巧在浏览Cpython文档时发现了这篇文章。它深入探讨了发电机的工作原理及其与Coroutine概念的关系。此外,它还显示了一些低级功能,例如选择器和期货,这确实启发了我研究Asyncio库的实际源代码。尽管这是有点古老的文章,但我仍然发现阅读真的很有趣。

  4. series created by an engineer who participated in a BBC cloud projectseries created by an engineer who participated in a BBC cloud project的一般结构的另一项很好的阅读。它概述了Asyncio功能的整体大图,它确实帮助我了解了这些功能如何以无缝的方式一起工作。

  5. 要了解发电机与Coroutines之间的关系,阅读this article by one of the main contributors of CPythona supplement of Fluent Python将阐明经典的Coroutine是什么。

结论

这将是一段漫长的旅程,尽管我从没想到会这样。我决定不介绍一些遗漏的东西,但我会尽力包括基本零件。