4 个版本

0.2.1 2023 年 9 月 6 日
0.2.0 2021 年 6 月 11 日
0.1.1 2019 年 11 月 13 日
0.1.0 2019 年 10 月 7 日

#469异步


用于 2 crate

无许可

14KB
115

async_progress

standard-readme compliant Build Status Docs crates.io

在并发异步任务之间创建同步点。

有时,尤其是在测试异步代码时,我们需要代码按照特定的顺序运行。使某些任务等待其他任务中发生的事情。您可以通过创建(一次性)通道来创建此类同步。当您的流程中有超过 2 个步骤时,通道很快就会变得难以跟踪和命名。 async_progress 允许您创建一个具有步骤的状态枚举,并通过 Progress::set_state 简单地触发它们,并使用 Progress::onceProgress::wait 等待它们。

警告:由于这是一个用于测试的便利包,我还没有麻烦为它编写测试。一些东西可能有错误。

目录

安装

使用 cargo add: cargo add async_progress

使用 cargo yaml

dependencies:

   async_progress: ^0.1

使用原始 Cargo.toml

[dependencies]

    async_progress = "^0.1"

升级

升级时请查看 变更日志

依赖关系

此 crate 依赖项很少。Cargo 将自动为您处理依赖项。

没有可选功能。

安全

此crate包含#![ forbid( unsafe_code ) ],但值得注意的是它所依赖的futures库使用了一些不安全的代码。它主要用于测试的便利性,因此尚未经过安全或性能的审查。

用法

重要的是要了解Progress使用pharos来提供可观察性,并且触发事件后订阅的观察者将不会接收到该事件。

因此,建议在开始任何可能调用Progress::set_state的工作之前,调用Progress::onceProgress::waitProgress::observe。然后可以将这些future传递给需要等待它们的任务。这还允许触发事件多次,这在其他情况下是不可能的。

有时你的下一个调用将是挂起的,但你需要为其他任务提供绿灯以执行某些操作。一般来说,在挂起的调用之前调用Progress::set_state是安全的。你的挂起调用将在其他任务观察到新状态之前被轮询。

基本示例

use
{
   async_progress :: Progress,
   futures        :: { executor::block_on, future::join } ,
};

// Some hypothetical steps in our flow.
//
#[ derive( Debug, Clone, PartialEq, Eq )]
//
enum Step
{
   FillQueue,
   SendText,
   ReadText,
}


#[ test ]
//
fn test_something()
{
   let steps     = Progress::new( Step::FillQueue );
   let send_text = steps.once( Step::SendText );
   let read_text = steps.once( Step::ReadText );

   // Remark we don't need to move here, we can work on shared references of the local vars.
   // We also don't need to clone steps, since all the methods on it only require a shared reference.
   //
   let server = async
   {
      // Fill some queue...

      steps.set_state( Step::SendText ).await;

      read_text.await;

      // Now we can read the text
   };

   let client = async
   {
      send_text.await;

      // Now we can send some text...

      steps.set_state( Step::ReadText ).await;
   };


   block_on( join( server, client ) );
}

API

API文档可以在docs.rs上找到。

贡献

此仓库接受贡献。想法、问题、功能请求和错误报告可以通过Github issues提交。

欢迎在Github上提交Pull Requests。通过提交Pull Requests,您同意您的代码可能会被修改和重新格式化以符合项目的编码风格或改进实现。如果您不想进行可能被拒绝的工作,请在提交Pull Requests之前讨论您希望看到哪些修改。

请针对dev分支提交PR,不要忘记更新变更日志和文档。

测试

目前没有测试。cargo doc --no-deps --all-features将测试此readme中的示例。

行为准则

公民行为准则的第四点“不可接受的行为”中描述的任何行为都不受欢迎,并可能导致您被封禁。如果任何包括维护者和项目管理员在内的项目成员未能尊重这些/您的限制,您有权对其进行指责。

许可

许可证

依赖关系

~1–1.4MB
~23K SLoC