出色地。
我非常高兴地欢迎您来到我们一起踏上特工之地之旅的第二周。
另外，您知道，第二周的主题是开放 AI 代理 SDK（以前称为 swarm），已发布
最近，我们最新的成员进入了代理框架领域，我已经等不及了
告诉你一切。
但是首先，不是总有一个但是首先但是首先，在我们可以做开放的AI代理SDK之前，我有
一个侧边栏，一个我要跟你讲的话题，一个非常重要的话题，就是要和你谈谈
关于异步 Python 异步 IO。
这是所有代理框架中共有的东西。
所以它们都使用异步Python，而且你不需要真正的就可以做到这一点
理解。
您可以学习一些规则，然后始终遵循这些规则。
这会起作用，没关系。
但我在这里告诉你，这并不令人满意，最好只花半个小时
深入了解这个问题，真正理解它，仔细研究它，直到你觉得，好吧，
我得到了异步Python，我理解它，如果你这样做，如果你花半个小时，你
会感谢我的。
你会一次又一次地遇到这个，你会完全适应
它。
而且只有半个小时。
因此，我提供了一份指南，以及将引导您完成此过程的指南，以便您可以
您对编写异步 Python 意味着什么毫无疑问。
我现在也将在高层次上非常简短地介绍它。
我们来谈谈异步IO。
嗯，看，首先有一个简短的版本，一个简单的版本。
这就是我说即使不真正理解也能过得去的意思。
所以async IO是一种编写Python代码的方式，它是多线程的一种轻量级版本。
许多具有软件工程背景的人都会熟悉多线程的概念。
当您编写可以并发运行的代码时，可以有多个线程，每个线程都在执行
一起编码，通常会带来很多包袱，比如某种框架的东西
随之而来的。
嗯，异步 IO，我认为是在 Python 3.5 中引入的，是一种非常轻量级的做法
它实际上并不涉及操作系统级别的线程。
而且它也不涉及所谓的多处理，即生成多个 Python
进程并且它们都一起运行。
这是另一种超轻量级的实现方法。
而且因为它超轻，这意味着您可以拥有数千或数万个这样的
一切都在不消耗太多资源的情况下运行。
因此，这是一种简单、轻松、轻量级的编写可以并发运行的代码的方法。
尤其是当您的代码使用输入输出（例如等待网络）时，它尤其有用。
它允许其他事物运行。
当一小部分代码在网络上等待时，当您运行 LM 请求时，您大部分时间都在等待。
如果您使用 OpenAI 等付费 API，则大部分时间都花在等待反馈上
来自在云上运行的模型。
所以网络上有很多等待，很多 IO 绑定等待。
因此，异步代码非常好用。
当您考虑多代理框架时，您可能会遇到很多这样的情况
不同的 API，使用它非常有意义。
这就是我们将要讨论的所有框架都使用异步 IO 的原因。
好的。
这是序言的简短版本。
简短的版本是异步的。
IO实际上是两个东西。
这是一个可以导入的名为 async IO 的包，它也是一些烘焙的语言结构
进入Python。
这些语言结构包括您在此处看到的两个关键字。
这些关键字之一是“异步”一词。
任何时候你有一个函数，它可能能够以允许的方式运行
其他同时发生的事情，你只需将 async 这个词放在它前面，就像 async def 那样
一些处理，所以 def do someprocessing 变成 async def do someprocessing。
这就是你所说的这是一个可以异步运行的函数。
当您调用该函数时，您不只是像以前那样调用进行一些处理。
您必须在其前面加上“await”一词。
所以你说等待，做一些处理，如果做一些处理返回一个字符串，那么你不能只是
说结果等于做一些处理。
你必须说结果等于等待。
做一些处理。
但除此之外都是一样的。
这就是简短的版本。
如果你想在没有真正理解它的情况下度过难关，你可以遵循这些规则并
继续下去，可能就足够了。
但现在让我告诉你更大的故事。
好的。
现在我们将更深入地讨论异步 IO 的真实故事。
所以正如我所说，它是多线程或多处理的轻量级替代方案。
诸如多线程之类的东西是在操作系统级别实现的。
并且它支持不同CPU、CPU级别的程序的并发执行
设法在这两个程序之间进行切换，并将它们视为同时运行
时间。
这在异步 IO 的情况下有所不同。
所以有一些特殊的关键词。
有这个关键字async。
如果您将函数定义为 async def，然后定义该函数，而不是仅定义该函数，那么
这个东西实际上已经不叫函数了。
它被称为协程。
现在大多数人仍然使用函数这个词。
你会听到我说函数，但严格来说，每当你看到 async def 时，你应该说，
好吧，这不是一个函数，它是一个协程。
这意味着 Python 可以暂停和恢复，这是很特别的。
当您调用协程时，它不会像您调用的任何其他运行的函数那样运行。
当你调用协程时，它只是返回一个协程对象，但实际上并没有执行任何操作
运行该协程对象。
有几种方法可以做到这一点，但最常见的一种，也是我们将一直使用的一种
就是等待它。
所以你说await，然后是协程对象并安排它执行。
计划执行是什么意思？
嗯，异步 IO 库中有一段代码，它执行所谓的事件
循环，这意味着它是一种迭代的 while 循环，它采用这个协程并开始
执行它，并且它一次只能执行一个协程。
它不像多线程。
它将执行该协程，除非该协程到达停止点
它正在等待类似等待 IO 的东西。
也许。
也许它已向 OpenAI 发出了呼叫，并且正在等待 OpenAI 响应。
此时，事件循环可以暂停该事件并开始执行另一个协程
它位于等待运行的协程列表中。
如果在等待 IO 时达到某一点，那么事件循环可以运行另一个事件循环或者它
可以继续第一个。
所以这是一种处理多线程的手动方法。
这是一种实现多线程的手动方法，但只有在某些内容被阻塞时才真正起作用。
等待我o。
正因为如此，因为它是在代码级别编写的，并且非常简单且非常容易
要理解，它也是轻量级的。
你可以拥有数千或数万个这样的东西。
而且，运行起来非常简单快捷。
这就是它如此受欢迎的原因。
这就是为什么它在遗传框架中如此普遍地使用。
所以我希望显然我在这里只给了你一些细节，但我希望这能给你一些观点
关于正在发生的事情。
当我们现在回顾这一点时，你会发现虽然简单的解释只是
好吧，每当我使用 async 时，我就必须使用 wait。
更深入的解释是要理解当我说 async def 做一些不再是的处理时
一个函数，它现在是一个协程，做一些处理。
我们需要调用await，进行一些处理以安排该协程。
现在正在阻塞，直到完成并且结果将进入该变量结果。
我希望这有一定道理，但如果没有，正如我所说，这里有一个完整的指南。
你现在应该去看看指南。
为了彻底解决这个问题，我再举几个例子。
然后希望你真的明白了。
所以再看看这个。
这又回到async def做一些处理了。
它将做一些工作。
然后它将返回完成的字符串。
如果我只是说我的协程等于做一些处理，你可能，你知道，如果你不知道
已经了解了这一点，您可能会认为这将运行一些处理。
但当然不会。
它将返回一个协程对象，这就是变量（我的协程）中的内容。
为了实际运行它，你必须调用await。
所以你会说我的结果等于等待我的协程。
现在它要运行了。
结果呢？
完成的字符串将进入我的结果。
这就是重点。
这就是它的工作原理。
当然你不需要这样做。
比那更简单。
你可以说我的结果等于等待。
做一些处理，这是我们一直做的事情。
然后只是希望将这些点连接起来，让这真正适合你。
还有其他构造，您不必只调用 wait。
然后是协程的名称，因为如果这就是你所能做的，你可能会想，你可能
对我说，好吧，坚持住。
但在这种情况下，这里就没有真正发生任何并发事件。
每次我调用await，然后调用协程时，它都会阻塞，直到完成，然后它就会继续
继续下一步。
嗯，异步 IO 包中还有一些其他构造，可以让我们做得更多
有趣的事情，这是其中之一，也是我们本周将在代码中使用的事情。
在这里你可以说结果，复数结果等于等待。
然后调用这个函数Asyncio dot Gather。
然后你可以传入多个协程。
我相信你可以想象会发生什么。
但事件循环将安排这三个事件。
一旦其中一个阻塞，其他的就会开始运行，或者其他的一个会运行
直到它被阻塞，然后第三个将运行。
因此，所有这三个协程将、将、将运行、将执行。
结果作为列表将进入变量 results，即来自的三个结果中的每一个的列表
这三个协程中的每一个。
所以在某些方面它是一种假多线程。
这是一种强力多线程。
它不是操作系统级别的多线程，而是几乎手动实现的多线程
使用此事件循环，只需处理 IO 阻塞之类的事情并能够安排下一个
一。
就是这样想的。