4个版本
0.2.2 | 2021年2月12日 |
---|---|
0.2.1 | 2021年2月12日 |
0.2.0 | 2021年2月12日 |
0.1.0 | 2021年2月3日 |
#650 in WebAssembly
62KB
866 行
agnostic_async_executor
agnostic_async_executor是一个Rust库,帮助您编写无差别执行器的异步库和应用。
它支持多种常见的执行器,适用于各种用例。当您需要强大和兼容性时,可以使用Tokio和Async Std;当您需要轻量级执行器时,可以使用Smol和Futures crate执行器;如果您需要wasm支持,可以使用Wasm Bindgen。
编写无差别异步库非常简单,这真正有助于整个生态系统,而不会将用户锁定在单个执行器上。只需依赖这个库,不要使用任何特定于执行器的功能,并要求用户提供AgnosticExecutor。您可以在源代码的example_crates下看到一个完整的示例。
功能
该库的主要目的是为您提供易于使用的AgnosticExecutor类型。它是一个简单的结构体,实现了Clone、Send,并且可以按需轻松存储和共享。
AgnosticExecutor可以用来创建新的异步任务,并且您可以选择创建可能阻塞的任务(但请注意,这只是向执行器提示,它可能会被忽略)。
如果您需要执行不是Send的任务,您可以使用LocalAgnosticExecutor来执行,这仅适用于启动执行器的线程。未来我们将添加对支持该特性的底层执行器的本地任务创建支持,但请注意,这将限制可用的执行器选择,特别是它将不支持tokio。
除了执行任务外,该库还提供了一种无差别处理异步时间的方式。它提供了让当前异步任务休眠一定时间、为异步任务添加超时、等待重复间隔和用计时器测量时间的方法。所有这些都在每个执行器(包括wasm)的底层方法中实现,以获得最佳性能和精度。
另一个重要功能是测试,我们提供了一种无差别的方式来测试您的异步代码,在所有支持的执行器中,无需为每个执行器编写独立的测试,并使用统一的测试策略,即使在像wasm中的嵌套异步调用这样的最具挑战性的情况下也能工作。
最后,围绕agnostic_async_executor正在开发更多功能和可能是一个完整的crate生态系统。例如,目前正在实现一个轻量但强大的actor系统,用于那些需要异步代码但又需要具有可变访问其自身状态的持久实体的时刻。
支持的货物功能
待办事项
如何使用
在库中
将 agnostic_async_executor = "0.2.0"
添加到您的依赖中。您可以选择包括泛型功能,但如果不希望它具有执行器相关性,则不要包括执行器相关功能。
TODO
在使用无差别库的应用程序中
将 agnostic_async_executor = { version = "0.2.0", features = ["xxx_executor"]}
添加到您的依赖中。您需要至少包括一个执行器功能,以便能够创建执行器并将其传递给库。
TODO
为什么你应该使用这个库
其他无差别执行器库已经存在,但它们都有许多缺点,这些缺点使得它们无法作为无差别异步生态系统的骨干。
其他库大多基于为不同执行器实现的特性和。从理论上讲,这是一个好主意,因为您可以只为所需的任何执行器实现该特性。
但在实践中,这并不像看起来那么简单,即使可能,直接在库中集成新的执行器实现会更方便。所以我们并没有从使用特性中获得多少好处。
而且使用特性的问题是它们在 Rust 中真的很有限。
例如,async_executors crate 给您提供了一个相当方便的对象安全特性,但为了做到这一点,您需要提前提供任何 spawn 函数的返回类型,因为它本身是特性的一个参数。这可能适用于某些库,但在其他情况下是一个严重的限制。而且与它的交互方式与直接与底层执行器交互的方式非常不同。
我们在 agnostik crate 中找到了另一种选择。他们决定采用简单而强大的 API,但代价是特性不是对象安全的。这看起来可能是一个小细节,但它对您的整个应用程序影响很大。要在任何地方存储执行器,您需要有一个具体的类型,为了做到这一点,您需要在库的各个地方添加一个泛型参数。
futures crate 也提供了一些特性来制作无差别执行器库,但它们不提供实现,并且在自身方式上非常有限。
有关其他 crate 问题的更多详细信息,您可以在此评论中查看。
所有这些的解决方案是放弃使用无差别执行器特性,而是使用 AgnosticExecutor 结构体。这个结构体简单易用,没有任何之前的限制,您可以像需要的那样存储、克隆、跨线程发送它。
所有实现细节都隐藏了,您只需像使用底层执行器一样使用它。强大而简单。
唯一的缺点是您无法在库提供的执行器之外实现对新执行器的支持,所以如果您需要支持新的执行器,您可以在 GitHub 上创建一个 pull request。但正如我们之前所说的,在现实中,这就是您会做的事情,或者甚至不得不与基于特性的替代方案一起做。
许可证
此项目根据以下任一项许可:
该项目最初是从David Craven的async-spawner分支出来的,但已被重新设计成一个完全不同的库。尽管如此,原代码可能以某种形式保留在其中。
依赖项
~0-15MB
~149K SLoC