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

2023-12-21

今天,我发现了一个名为trio http://trio.readthedocs.io/en/latest/index.html它说它自己是一个供人类使用的异步 API。这些词有点相似requests'. As requests确实是一个不错的库,我想知道它的优点是什么trio.

这方面的文章不多,我只是找了一篇article https://vorpus.org/blog/some-thoughts-on-asynchronous-api-design-in-a-post-asyncawait-world/#the-curious-effectiveness-of-curio讨论curio and asyncio。出乎我的意料,trio说自己比curio(下一代古玩)。

文章读了一半,我找不到这两个异步框架之间的核心区别。它只是给出了一些例子curio的实现比asyncio的。但底层结构几乎是一样的。

那么有人能给我一个我必须接受的理由吗trio or curioasyncio?或者详细解释一下我为什么应该选择trio而不是内置的asyncio?


我来自哪里:我是《三重奏》的主要作者。我也是 curio 的主要贡献者之一(并撰写了您链接到的有关它的文章),并且是一名 Python 核心开发人员,他积极参与有关如何改进 asyncio 的讨论。

在 trio(和 curio)中,核心设计原则之一是永远不要使用回调进行编程;感觉更像是基于线程的编程而不是基于回调的编程。我想,如果你打开引擎盖,看看它们的内部实现方式,就会发现它们在某些地方使用了回调,或者如果你眯着眼睛看的话,它们与回调相当。但这就像说 Python 和 C 是等效的,因为 Python 解释器是用 C 实现的。You永远不要使用回调。

Anyway:

Trio 与 asyncio

Asyncio 更加成熟

第一个大的区别是生态系统的成熟度。当时我正在写这个2018年3月, 有many支持 asyncio 的库多于支持 trio 的库。例如,现在还没有任何真正支持三重奏的 HTTP 服务器。这框架 :: PyPI 上的 AsyncIO 分类器 https://pypi.org/search/?c=Framework+%3A%3A+AsyncIO目前有 122 个图书馆,而框架 :: Trio 分类器 https://pypi.org/search/?c=Framework+%3A%3A+Trio只有 8。我希望这部分答案很快就会过时——例如,Kenneth Reitz 正在尝试在下一版本的 requests 中添加三重奏支持 https://twitter.com/kennethreitz/status/974963822682427393– 但现在,你应该预料到,如果你是三人组处理任何复杂的事情,那么你会遇到需要自己填写的缺失部分,而不是从 pypi 获取库,或者你需要使用trio-asyncio 包允许您在 trio 程序中使用 asyncio 库 https://trio-asyncio.readthedocs.io/. (The 三人聊天频道 https://gitter.im/python-trio/general对于了解可用的内容以及其他人正在做什么非常有用。)

Trio 让您的代码更简单

就实际的库而言,它们也有很大不同。 trio 的主要论点是,它使编写并发代码比使用 asyncio 简单得多。当然,你最后一次听到有人说他们的库让事情变得更难使用是什么时候......让我举一个具体的例子。在这次演讲 https://www.youtube.com/watch?v=i-R704I8ySE (slides https://github.com/python-trio/trio-talks/tree/master/njsmith-async-concurrency-for-mere-mortals),我使用实现的例子RFC 8305“快乐眼球” https://www.rfc-editor.org/rfc/rfc8305,这是一种简单的并发算法,用于有效地建立网络连接。这是一个东西Glyph https://stackoverflow.com/users/13564/glyph多年来一直在思考,他的 Twisted 最新版本大约有 600 行长。 (Asyncio 大致相同;Twisted 和 asyncio 在架构上非常相似。)在演讲中,我教您使用 trio 在

您可能还会发现用户的这些评论很有趣:1 https://github.com/python-trio/pytest-trio/issues/14#issuecomment-350454257, 2 https://github.com/python-trio/trio/issues/449#issuecomment-367796899, 3 https://gitter.im/python-trio/general?at=5ab8242f2b9dfdbc3a1fe9b1

细节上有很多很多差异

为什么会出现这种情况?这是一个更长的答案:-)。我正在逐渐致力于在博客文章和演讲中撰写不同的文章,并且我会尽力记住在链接可用时更新此答案。基本上,这可以归结为 Trio 拥有一小组精心设计的原语,这些原语与我所知道的任何其他库都有一些根本区别(当然,它们是建立在来自许多地方的想法的基础上)。以下是一些随机注释,可以给您一些想法:

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

Trio 管理超时和取消的方式很新颖,我认为比以前最先进的系统(如 C# 和 Golang)更好。事实上我确实写了一篇完整的文章 https://vorpus.org/blog/timeouts-and-cancellation-for-humans/所以我不会在这里详细讨论所有细节。但是 asyncio 的取消系统(或者说实际上是系统,它有两个语义略有不同的系统)基于比 C# 和 Golang 更古老的思想,并且很难正确使用。 (例如,代码很容易通过生成后台任务来意外“逃避”取消;请参阅上一段。)

有很多多余的东西stuff在 asyncio 中,可能会让人很难判断何时使用哪个东西 https://wiki.python.org/moin/TOOWTDI。你有 future、任务和协程,它们基本上都用于相同的目的,但你需要知道它们之间的区别。如果你想实现一个网络协议,你必须选择是使用协议/传输层还是流层,它们都有棘手的陷阱(这就是第一部分的内容)你链接的文章 https://vorpus.org/blog/some-thoughts-on-asynchronous-api-design-in-a-post-asyncawait-world/是关于)。

Trio 是目前唯一一个 Python 并发库,其中 control-C 按您期望的方式工作(即,它引发KeyboardInterrupt无论您的代码在哪里)。这是一件小事,但意义重大:-)。由于各种原因,我认为这在 asyncio 中无法修复。

加起来

如果您需要下周将某些东西交付生产,那么您应该使用 asyncio(或 Twisted、Tornado 或 gevent,它们更加成熟)。他们拥有庞大的生态系统,其他人在你之前已经在生产中使用了它们,而且他们不会去任何地方。

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

如果你想在一年后将某些东西投入生产......那么我不知道该告诉你什么。 Python 并发性不断变化。 Trio 在设计层面有很多优势,但这足以克服 asyncio 的领先优势吗?标准库中的 asyncio 是优势还是劣势? (注意现在每个人都如何使用requests,即使标准库有urllib https://docs.python.org/3/library/urllib.html.) trio 中有多少新想法可以添加到 asyncio 中?没人知道。我预计今年的 PyCon 上将会有很多有趣的讨论:-)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

asyncio 和 trio 之间的核心区别是什么? 的相关文章

随机推荐

  • 如何将 msbuild 升级到 C# 6?

    我想在我的项目中使用 C 6 空传播 其他功能 我已经在我的 PC 上安装了 VS 2015 它运行良好并构建了如下测试代码 var user new SingleUserModel all model fields are null va
  • Pandas:无法更改列数据类型

    我遵循了建议here https stackoverflow com questions 15891038 pandas change data type of columns更改 pandas 数据框的列数据类型 但是 如果我通过索引号而
  • mysqli_stmt_bind_result 上的 PHP 奇怪的段错误

    当将 PHP 脚本从 PHP 5 2 迁移到 PHP 5 3 时 我偶然发现了以下问题 该脚本的一般用途是数据挖掘 我里面有一个向 MySQL 服务器添加数据的过程 因为它确实是重复的 所以我 不久前 重写了它以使用 MySQLi 特别是准
  • Python 与 Javascript 浮点运算给出了截然不同的答案。我究竟做错了什么?

    Python版本 http code google com p pyglicko source browse glicko py JavaScript 版本 https github com austinyun JS Glicko blob
  • 使用 .html() 时,jQuery 是否会从字符串中删除一些 html 元素?

    我有一个包含完整 html 页面的 var 包括 head html body 等 当我将该字符串传递到 html 函数时 jQuery 会删除所有这些元素 例如 body html head 等 这是我不想要的 我的数据变量包含 那么我的
  • C# 中简单线程池的代码 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 在 gelf 连接失败时使用 Symfony 2 / Monolog 防止内部服务器错误

    我正在尝试使用 gelf 格式将日志从 symfony 2 应用程序流式传输到graylog 2 服务器 我的独白配置如下 monolog handlers 8 lt gt 8 graylog type gelf publisher hos
  • DWR 的缺点是什么?

    在内网中使用DWR时 会出现性能或安全问题等缺点吗 直接 Web 远程处理是一种使用 Ajax 请求从 js 文件联系服务器的工具 我要注意的一件事是 与 正常 全页 HTTP 交付相比 您的服务器很可能会受到更多 HTTP 请求的攻击 让
  • 为什么在测试 MediaRecorder 示例时出现致命异常?

    我使用 Android Studio 在真实设备中测试示例 E Android SDK samples android 22 media MediaRecorder 出现以下错误 为什么 样本中是否存在一些错误 顺便说一句 我的 Andro
  • 返回按钮和上次活动

    我的应用程序链接了一些活动 如果您按后退按钮 您会返回到旧的活动 然后您会突然退出应用程序 所以如果它是堆栈上的最后一个活动 我需要显示一条消息 例如 你真的想退出吗 我知道如何覆盖后退按钮 但我不知道如何知道历史中有多少活动 Overri
  • 为 SQL Server 中的字段生成唯一哈希

    我正在编写一个会员提供程序 以便与我们现有的会员基础一起使用 我使用 EF4 1 进行所有数据库访问 我遇到的问题之一是 当数据库最初设置时 关系是以编程方式完成的 而不是在数据库中完成的 一种是如果需要在并非所有用户都需要的列上建立关系
  • 如何在WebRTC对等连接中创建数据通道?

    我正在尝试学习如何创建一个RTCPeerConnection这样我就可以使用DataChannelAPI 这是我根据我的理解尝试过的 var client new mozRTCPeerConnection var server new mo
  • PHP、PDO 和异常

    我目前对于 PDO 有点进退两难 我最近转而从我自己的自定义数据库类中使用它 因为我想利用事务 我面临的问题是如何从已经用 PDO 的 try catch 包装的代码块内部抛出异常 这是一个例子 try PDO code Transacti
  • 如何在React hooks中自动停止setInterval?

    我想构建一个循环进度条 计数到 60 然后自动停止 但它无法停止 我想使用 React hooks 和 useEffect 我的代码在这里 https codesandbox io s nostalgic khorana lijdyo fi
  • 如何在 iOS 15 Xcode 13 中将 TabView tabItem 上的填充图标更改为不填充?

    如何将 iOS 15 Xcode 13 中的 TabView tabItem 上的填充图标更改为不填充 现在看来图标是默认填充的 我的代码 import SwiftUI struct Test Home V View var body so
  • Promise.catch() 在 AngularJS 单元测试中没有捕获异常

    我正在 Typescript 中为我的应用程序编写 Jasmine 单元测试 并通过 Resharper 运行它们 如果处理程序抛出异常 它应该执行一个操作 describe Q Service Test gt var q ng IQSer
  • 边缘会话.cookie_lifetime

    我的网站功能在 Edge 上损坏 尤其是登录 有人告诉我这与session cookie lifetime 对于此事的任何帮助 我将不胜感激 请注意 我不是开发人员 没有任何代码知识 我的一些 php ini 文件 如果有帮助的话 sess
  • 查找上个月

    我见过一些使用的方法dateutil模块来执行此操作 但是有没有一种方法可以在不使用内置库的情况下执行此操作 例如 当前月份是七月 我可以使用datetime now 功能 python 返回上个月的最简单方法是什么 这很简单 gt gt
  • 是否可以在函数内使用 Excel 数组中的单个单元格引用?

    我有一些数据想要放入 LOGEST 函数中 e g x values 0 463 0 609 0 887 y values 0 05 0 1 0 2 For this example I have put the data into the
  • asyncio 和 trio 之间的核心区别是什么?

    今天 我发现了一个名为trio http trio readthedocs io en latest index html它说它自己是一个供人类使用的异步 API 这些词有点相似requests As requests确实是一个不错的库 我