asyncio和trio的核心区别是什么?

2024-04-28 07:49:38 发布

您现在位置:Python中文网/ 问答频道 /正文

今天,我发现了一个名为trio的库,它自称是人类的异步API。这些词与requests有点相似。由于requests是一个很好的库,我想知道trio的优点是什么。

关于它的文章不多,我只找到一篇讨论curioasyncio的文章。令我惊讶的是,trio说自己甚至比curio(下一代古玩)更好。

在阅读了一半的文章之后,我找不到这两个异步框架之间的核心区别。它只是给出了一些例子,curio的实现比asyncio的实现更方便,但是底层结构几乎相同(基于回调,我认为所有异步IO框架都是基于回调的,没有例外)

那么有人能给我一个理由让我接受triocurioasyncio好吗?或者解释为什么我应该选择trio而不是内置的asyncio


Tags: 框架apiasyncio核心curiotrio文章人类
1条回答
网友
1楼 · 发布于 2024-04-28 07:49:38

我来自哪里:我是三重奏的主要作者。我也是curio的顶级贡献者之一(并写了一篇关于它的文章,您可以链接到它),也是一个Python核心开发人员,他一直在讨论如何改进异步。

我不知道你说的回调是什么意思。在trio(和curio)中,核心设计原则之一是永远不要使用回调进行编程;它感觉更像基于线程的编程,而不是基于回调的编程。我想如果你打开引擎盖,看看它们是如何在内部实现的,那么在某些地方它们使用回调,或者如果你斜视的话,它们相当于回调。但这就像说Python和C是等价的,因为Python解释器是用C实现的。从不使用回调。

无论如何:

三重奏vs异步

Asyncio更成熟

第一大区别是生态系统的成熟度。当我在2018年3月写这篇文章的时候,有比trio支持更多的支持异步的库。例如,现在没有任何真正的支持trio的HTTP服务器。Framework :: AsyncIO classifier on PyPI目前有122个库,而Framework :: Trio classifier只有8个。我希望这部分答案很快就会过时,例如,here's Kenneth Reitz experimenting with adding trio support in the next version of requests但是现在,你应该预料到,如果你对任何复杂的事情都是三重奏,那么你会遇到需要自己填写的缺失部分,而不是从pypi中获取库,或者需要使用the trio-asyncio package that lets you use asyncio libraries in trio programs。(trio chat channel对于发现可用的内容以及其他人正在处理的内容非常有用。)

Trio使代码更简单

就实际的库而言,它们也非常不同。trio的主要论点是,它使编写并发代码比使用asyncio简单得多。当然,你最后一次听到有人说他们的图书馆使东西更难使用是什么时候。。。让我举一个具体的例子。在this talkslides)中,我使用了实现RFC 8305 "Happy eyeballs"的示例,这是一个用于有效建立网络连接的简单并发算法。这是Glyph多年来一直在考虑的事情,他最新的Twisted版本大约有600行长。(Asyncio应该差不多;Twisted和Asyncio在架构上非常相似。)在演讲中,我将教您使用trio在<;40行中实现它所需的所有知识(我们在使用trio时修复了他的版本中的一个bug)。所以在这个例子中,使用trio字面上使我们的代码简单了一个数量级。

您还可能会发现来自用户的这些评论很有趣:123

在细节上有许多不同

为什么会这样?答案要长得多:-)。我正在逐渐地在博客文章和谈话中写下不同的部分,我会尽量记住在这些链接可用时用它们更新这个答案。基本上,这可以归结为Trio拥有一组精心设计的原语,这些原语与我所知道的任何其他库都有一些根本的不同(当然,它们建立在许多地方的思想之上)。以下是一些随机笔记,让您有所了解:

异步和相关库中一个非常非常常见的问题是,您调用some_function(),它返回,所以您认为它已经完成了,但实际上它仍在后台运行。这会导致各种棘手的错误,因为它很难控制事情发生的顺序,或者知道什么事情实际上已经完成,而且它可以直接隐藏问题,因为如果后台任务因未处理的异常而崩溃,asyncio通常只会将一些东西打印到控制台,然后继续运行。在trio中,我们通过“nurseries”处理任务生成的方式意味着这些事情都不会发生:当函数返回时,您就知道它已经完成了,trio是Python当前唯一的并发库,其中异常总是传播到您捕获它们为止。

Trio管理超时和取消的方式很新颖,我认为比以前的最先进的系统(如C#和Golang)要好。I actually did write a whole essay on this,所以我不会在这里讨论所有的细节。但asyncio的取消系统——或者说实际上,它有两个语义稍有不同的系统——是基于一套甚至比C和Golang更古老的思想,很难正确使用。(例如,代码很容易通过生成后台任务意外地“转义”取消操作;请参见上一段。)

异步中有很多冗余的东西,它们是can make it hard to tell which thing to use when。你有未来,任务和合作,这些基本上都是用于相同的目的,但你需要知道它们之间的区别。如果你想实现一个网络协议,你必须选择是使用协议/传输层还是流层,它们都有棘手的陷阱(这就是the essay you linked的第一部分)。

Trio目前是Python唯一的并发库,其中control-C的工作方式与您期望的一样(即,它在您的代码所在的地方引发KeyboardInterrupt)。这是一件小事,但却有很大的不同。出于各种原因,我认为这在异步中是不可修复的。

总结

如果你需要在下周发布一些产品,那么你应该使用asyncio(或者Twisted、Tornado或gevent,它们更加成熟)。它们有着巨大的生态系统,其他人在你之前就已经将它们用于生产,而且它们不会去任何地方。

如果尝试使用这些框架会让你感到沮丧和困惑,或者想尝试不同的做事方式,那么一定要看看trio——我们很友好:-)。

如果你想从现在起一年内把东西运到生产现场。。。那我不知道该告诉你什么。Python并发性在不断变化。Trio在设计层面有很多优势,但这是否足以克服asyncio的先机?异步在标准库中是一个优势,还是一个劣势?(注意现在每个人都是如何使用requests,即使标准库有urllib)有多少trio中的新思想可以添加到asyncio中?没人知道。我希望今年在PyCon会有很多有趣的讨论。

相关问题 更多 >