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

时间:2018-03-26 02:07:38

标签: python asynchronous python-asyncio python-trio curio

今天,我找到了一个名为trio的库,它说自己是人类的异步API。这些单词与requests'有点类似。由于requests确实是一个很好的图书馆,我想知道trio的优势是什么。

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

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

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

1 个答案:

答案 0 :(得分:70)

我来自哪里:我是三人组的主要作者。我也是古玩的主要贡献者之一(并撰写了关于它的链接文章),以及一位参与讨论如何改进asyncio的Python核心开发人员。

我不确定你对回调的意思。在trio(和curio)中,核心设计原则之一就是你从不用回调编程;感觉更像基于线程的编程而不是基于回调的编程。我想如果你打开引擎盖并看看它们是如何在内部实现的,那么有些地方他们会使用回调,或者如果你眯着眼睛那么等同于回调的东西。但这就像说Python和C是等价的,因为Python解释器是用C实现的。从不使用回调。

反正:

Trio vs asyncio

Asyncio更成熟

第一个巨大的差异是生态系统的成熟度。当我在 2018年3月中写这篇文章时,有许多多个具有asyncio支持的库而不是三人支持。例如,目前还没有任何真正的HTTP服务器支持三人组。 Framework :: AsyncIO classifier on PyPI目前有122个库,而Framework :: Trio classifier只有8个。我希望这部分答案会很快过时 - 例如{{3} } - 但是现在,你应该期待如果你因为任何复杂的事情而三重奏,那么你会遇到缺少的东西,你需要自己填写而不是从pypi中抓取一个库,或者你#&# 39; ll需要使用here's Kenneth Reitz experimenting with adding trio support in the next version of requests。 (the trio-asyncio package that lets you use asyncio libraries in trio programs有助于了解可用的内容以及其他人的工作内容。)

Trio使您的代码更简单

就实际图书馆而言,它们也非常不同。三重奏的主要论点是它使编写并发代码比使用asyncio简单得多。当然,当你最后一次听到有人说他们的图书馆让事情变得更难使用时......让我举一个具体的例子。在trio chat channelthis talk)中,我使用了实现slides的示例,这是一种用于有效建立网络连接的简单并发算法。这是RFC 8305 "Happy eyeballs"多年来一直在考虑的问题,他最新版本的Twisted长约600行。 (Asyncio大致相同; Twisted和asyncio在架构上非常相似。)在演讲中,我教你使用trio在< 40行中实现它所需要知道的一切(我们修复了他的版本中的错误) #39;重新开始)。所以在这个例子中,使用trio字面意思使我们的代码更简单。

您可能还会发现以下用户的这些评论很有趣:Glyph12

细节上有很多差异

为什么会这样?这是一个更长的答案:-)。我正在逐步编写博客文章和演讲中的不同部分,并且我会尝试记住在链接可用时更新此答案。基本上,它归结为Trio有一小部分精心设计的原语,与我所知道的任何其他库有一些根本区别(虽然当然建立在很多地方的想法上)。这里有一些随机的注释,可以给你一些想法:

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

Trio管理超时和取消的方式是新颖的,我认为比以前最先进的系统如C#和Golang更好。 3所以我不会在这里详细介绍所有细节。但是asyncio的取消系统 - 或者说真的是系统,它有两个语义略有不同 - 基于比C#和Golang更古老的想法,并且很难正确使用。 (例如,代码很容易被意外地"逃避"通过产生后台任务取消;见前一段。)

asyncio中有大量冗余的东西I actually did write a whole essay on this,。你有期货,任务和协同程序,这些都基本上用于相同的目的,但你需要知道它们之间的差异。如果要实现网络协议,则必须选择是使用协议/传输层还是流层,它们都有棘手的陷阱(这就是can make it hard to tell which thing to use when的第一部分)。 / p>

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

总结

如果您需要在下周将产品运送到生产中,那么您应该使用asyncio(或Twisted或Tornado或gevent,它们更加成熟)。他们拥有庞大的生态系统,其他人在你之前就将它们用于生产中,并且他们不会去任何地方。

如果尝试使用这些框架会让您感到沮丧和困惑,或者想要尝试不同的做事方式,那么一定要检查三重奏 - 我们非常友好: - )。

如果你想在一年后将产品运到生产中......那么我不知道该告诉你什么。 Python并发性正在变化。 Trio在设计层面有很多优势,但足以克服asyncio的先声夺人? asyncio在标准库中是优势还是劣势? (注意这些天每个人都使用requests,尽管标准库有the essay you linked。)三人组中有多少新想法可以添加到asyncio?没人知道。我希望今年PyCon会有很多有趣的讨论: - )。