From 0339c9982a3827c382580ebecd280008adbc4121 Mon Sep 17 00:00:00 2001 From: QIUZHILEI <2925212608@qq.com> Date: Mon, 17 Jul 2023 09:25:20 +0800 Subject: [PATCH 1/3] dismiss warning;drawing with mermaid Signed-off-by: QIUZHILEI <2925212608@qq.com> --- README.md | 139 +++++++++++++++++++++++++++++++------- assets/loop.png | Bin 12481 -> 0 bytes assets/tasks.png | Bin 15839 -> 0 bytes examples/custom_parser.rs | 8 +-- src/task/mod.rs | 2 +- 5 files changed, 118 insertions(+), 31 deletions(-) delete mode 100644 assets/loop.png delete mode 100644 assets/tasks.png diff --git a/README.md b/README.md index f0d938e..b72afb4 100644 --- a/README.md +++ b/README.md @@ -1,16 +1,25 @@ # Dagrs -## What is dagrs +`dagrs` are suitable for the execution of multiple tasks with graph-like dependencies. `dagrs` has the characteristics of high performance and asynchronous execution. It provides users with a convenient programming interface. -dagrs are suitable for the execution of multiple tasks with graph-like dependencies. dagrs has the characteristics of high performance and asynchronous execution. It provides users with a convenient programming interface. +## What can `dagrs` do -## What can dagrs do - -dagrs allows users to easily execute multiple sets of tasks with complex graph dependencies. It only requires: -The user defines tasks and specifies the dependencies of the tasks, and dagrs can execute the tasks sequentially in the topological sequence of the graph. +`dagrs` allows users to easily execute multiple sets of tasks with complex graph dependencies. It only requires: +The user defines tasks and specifies the dependencies of the tasks, and `dagrs` can execute the tasks sequentially in the topological sequence of the graph. For example: -![image-20230713164020589](assets/tasks.png) +```mermaid +flowchart LR + A((Task a))-->B + A-->C + B((Task b))-->D + C((Task c))-->D + B-->F + C-->E + D((Task d))-->G + E((Task e))-->G + F((Task f))-->G((Task g)) +``` This graph represents the dependencies between tasks, and the graph composed of tasks must satisfy two points: @@ -18,13 +27,22 @@ This graph represents the dependencies between tasks, and the graph composed of - The graph itself is directed, and the user must ensure that there are no loops in the graph, that is, the dependencies of tasks cannot form a closed loop, otherwise the engine will refuse to execute all tasks, for example: - ![image-20230713164229768](assets/loop.png) + ```mermaid + flowchart LR + A-->C + A((Task 1))-->B + subgraph "Task B, C, and D form a loop" + B((Task 2))-->C + C((Task 3))-->D + D((Task 4))-->B + end + ``` Among them, each task may produce output, and may also require the output of some tasks as its input. -## Try using dagrs +## Try using `dagrs` -dagrs provides two basic task definition methods, which are programming to implement the logic of the task and defining the yaml configuration file. Programmatically implementing the definition of tasks will make the logic of tasks more flexible, and it is also the main method of using dagrs. Next, we will introduce the usage of the two methods in detail. +`dagrs` provides two basic task definition methods, which are programming to implement the logic of the task and defining the yaml configuration file. Programmatically implementing the definition of tasks will make the logic of tasks more flexible, and it is also the main method of using `dagrs`. Next, we will introduce the usage of the two methods in detail. *Make sure the Rust compilation environment is available.* @@ -46,7 +64,7 @@ use dagrs::{ struct SimpleAction(usize); /// Implement the `Action` trait for `SimpleAction`, defining the logic of the `run` function. -/// The logic here is simply to get the output value (usize) of all predecessor tasks and then accumulate. +/// The logic here is simply to get the output value (`usize`) of all predecessor tasks and then accumulate. impl Action for SimpleAction{ fn run(&self, input: Input,env:Arc) -> Result { let base = env.get::("base").unwrap(); @@ -96,12 +114,9 @@ Finally we call the `start` function of `Dag` to execute all tasks. After the ta The graph formed by the task is shown below: -``` - B - ↗ ↘ - A D - ↘ ↗ - C +```mermaid +flowchart LR; + A((Task a))-->B; A-->C; B((Task b))-->D; C((Task c))-->D((Task d)); ``` The execution order is a->c->b->d. @@ -226,7 +241,7 @@ Executing Task[name: Task 1] You can see an example: `examples/yaml_dag.rs`. In fact, you can also programmatically read the yaml configuration file generation task, which is very simple, just use the `with_yaml` function provided by `Dag` to parse the configuration file. -**In addition to these two methods, dagrs also supports advanced task custom configuration.** +**In addition to these two methods, `dagrs` also supports advanced task custom configuration.** - `DefaultTask` is a default implementation of the `Task` trait. Users can also customize tasks and add more functions and attributes to tasks, but they still need to have the four necessary attributes in `DefaultTask`. `YamlTask` is another example of `Task` concrete implementation, its source code is available for reference, or refer to `example/custom_task.rs`. - In addition to yaml-type configuration files, users can also provide other types of configuration files, but in order to allow other types of configuration files to be parsed as tasks, users need to implement the `Parser` trait. `YamlParser` source code is available for reference, or refer to `examples/custom_parser.rs` @@ -236,15 +251,87 @@ You can see an example: `examples/yaml_dag.rs`. In fact, you can also programma **The execution process of Dag is roughly as follows:** - The user gives a list of tasks `tasks`. These tasks can be parsed from configuration files, or provided by user programming implementations. -- Internally generate`Graph`based on task dependencies, and generate execution sequences based on* `rely_graph`. + +- Internally generate `Graph` based on task dependencies, and generate execution sequences based on* `rely_graph`. + + ```mermaid + flowchart TD + subgraph tasks + direction LR + A-->B + A-->C + B-->D + B-->F + C-->D + C-->E + D-->F + E-->F + end + subgraph seq + direction LR + a(A)-->b(B)-->c(C)-->d(D)-->e(E)-->f(F) + end + tasks==Generate execution sequence based on topological sort==>seq + ``` + + + - The task is scheduled to start executing asynchronously. + - The task will wait to get the result`execute_states`generated by the execution of the predecessor task. + + ```mermaid + --- + title: data flow + --- + flowchart LR + A-->oa((out)) + oa--input-->B + oa--input-->C + B-->ob((out)) + ob--input-->D + ob--input-->F + C-->oc((out)) + oc--input-->D + oc--input-->E + D-->od((out)) + od--input-->F + E-->oe((out)) + oe--input-->F + F-->of((out)) + ``` + + + - If the result of the predecessor task can be obtained, check the continuation status`can_continue`, if it is true, continue to execute the defined logic, if it is false, trigger`handle_error`, and cancel the execution of the subsequent task. -- After all tasks are executed, set the continuation status to false, which means that the tasks of the dag cannot be scheduled for execution again. -![image-20230713171109893](assets/execute_logic.png) +- After all tasks are executed, set the continuation status to false, which means that the tasks of the `dag` cannot be scheduled for execution again. + +The task execution mode of `dagrs` is parallel. In the figure, the execution sequence is divided into four intervals by the vertical dividing line. During the overall execution of the task, it will go through four parallel execution stages. As shown in the figure: first task A is executed, and tasks B and C obtain the output of A as the input of their own tasks and start to execute in parallel; similarly, tasks D and E must wait until they obtain the output of their predecessors before starting to execute in parallel; finally, Task F must wait for the execution of tasks B, D, and E to complete before it can start executing. + +```mermaid +gantt + dateFormat X + axisFormat %s + title Execution timing + section Step1 + Task A:0,10 + Task B:0,1 + Task C:0,1 + Task D:0,1 + Task E:0,1 + Task F:0,1 + section Step2 + Task B:10,19 + Task C:10,19 + section Step3 + Task D:19,28 + Task E:19,28 + section Step4 + Task F:28,37 +``` + -The task execution mode of dagrs is parallel. In the figure, the execution sequence is divided into four intervals by the vertical dividing line. During the overall execution of the task, it will go through four parallel execution stages. As shown in the figure: first task A is executed, and tasks B and C obtain the output of A as the input of their own tasks and start to execute in parallel; similarly, tasks D and E must wait until they obtain the output of their predecessors before starting to execute in parallel; finally, Task F must wait for the execution of tasks B, D, and E to complete before it can start executing. ## The examples @@ -256,7 +343,7 @@ The task execution mode of dagrs is parallel. In the figure, the execution seque `examples/yaml_dag.rs`: Spawn multiple tasks with a given yaml configuration file。 -`examples/use_macro.rs`: Use the `gen_task` macro provided by dagrs to generate multiple simple tasks。 +`examples/use_macro.rs`: Use the `gen_task` macro provided by `dagrs` to generate multiple simple tasks。 `examples/engine.rs`: Using `Engine` to manage multiple dags with different task types. @@ -270,7 +357,7 @@ The task execution mode of dagrs is parallel. In the figure, the execution seque ## Contribution -The dagrs project relies on community contributions and aims to simplify getting started. To develop dagrs, clone the repository, then install all dependencies, run the test suite and try it out locally. Pick an issue, make changes, and submit a pull request for community review. +The dagrs project relies on community contributions and aims to simplify getting started. To develop `dagrs`, clone the repository, then install all dependencies, run the test suite and try it out locally. Pick an issue, make changes, and submit a pull request for community review. ### What's the contribution @@ -280,10 +367,10 @@ Here are some guidelines for contributing to this project: 2. Suggest enhancements: If you have an idea to enhance or improve this project, you can suggest it by creating an issue on the issue tracker. Explain your enhancement in detail along with its use cases and benefits. I appreciate well-thought-out enhancement suggestions. 3. Contribute code: If you want to develop and contribute code, follow these steps: - Choose an issue to work on. Issues labeled `good first issue` are suitable for newcomers. You can also look for issues marked `help wanted`. - - Fork the dagrs repository and create a branch for your changes. + - Fork the `dagrs` repository and create a branch for your changes. - Make your changes and commit them with a clear commit message. Sign the [Developer Certificate of Origin](https://developercertificate.org/) (DCO) by adding a `Signed-off-by` line to your commit messages. This certifies that you wrote or have the right to submit the code you are contributing to the project. - Push your changes to GitHub and open a pull request. - - Respond to any feedback on your pull request. The dagrs maintainers will review your changes and may request modifications before merging. Please ensure your code is properly formatted and follows the same style as the existing codebase. + - Respond to any feedback on your pull request. The `dagrs` maintainers will review your changes and may request modifications before merging. Please ensure your code is properly formatted and follows the same style as the existing codebase. - Once your pull request is merged, you will be listed as a contributor in the project repository and documentation. 4. Write tutorials/blog posts: You can contribute by writing tutorials or blog posts to help users get started with this project. Submit your posts on the issue tracker for review and inclusion. High quality posts that provide value to users are highly appreciated. 5. Improve documentation: If you find any gaps in the documentation or think any part can be improved, you can make changes to files in the documentation folder and submit a PR. Ensure the documentation is up-to-date with the latest changes. diff --git a/assets/loop.png b/assets/loop.png deleted file mode 100644 index 664856468cdda1fc4345c24669d096851a49fc4c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12481 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 diff --git a/assets/tasks.png b/assets/tasks.png deleted file mode 100644 index 8aedb98ce77dbdf3ffc7b540105e6cc5c5663351..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15839 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 diff --git a/examples/custom_parser.rs b/examples/custom_parser.rs index 272d054..e202266 100644 --- a/examples/custom_parser.rs +++ b/examples/custom_parser.rs @@ -90,17 +90,17 @@ impl ConfigParser { fn parse_one(&self, item: String) -> MyTask { let attr: Vec<&str> = item.split(",").collect(); - let pres_item = attr.get(2).unwrap().clone(); + let pres_item = *attr.get(2).unwrap(); let pres = if pres_item.eq("") { Vec::new() } else { pres_item.split(" ").map(|pre| pre.to_string()).collect() }; - let id = attr.get(0).unwrap().clone(); + let id = *attr.get(0).unwrap(); let name = attr.get(1).unwrap().to_string(); - let script = attr.get(4).unwrap().clone(); - let t_type = attr.get(3).unwrap().clone(); + let script = *attr.get(4).unwrap(); + let t_type = *attr.get(3).unwrap(); if t_type.eq("sh") { MyTask::new( id, diff --git a/src/task/mod.rs b/src/task/mod.rs index 29581c4..db3e20e 100644 --- a/src/task/mod.rs +++ b/src/task/mod.rs @@ -118,7 +118,7 @@ use crate::utils::EnvVar; pub use self::error::{RunningError,JavaScriptExecuteError,ShExecuteError}; pub use self::script::{JavaScript,ShScript}; -pub use self::specific_task::{YamlTask}; +pub use self::specific_task::YamlTask; pub use self::state::{Output,Input}; pub(crate) use self::state::ExecState; From 9211003254481bc7691d9b705fd8ee6c79c15340 Mon Sep 17 00:00:00 2001 From: QIUZHILEI <2925212608@qq.com> Date: Mon, 17 Jul 2023 09:25:43 +0800 Subject: [PATCH 2/3] dismiss warning;drawing with mermaid Signed-off-by: QIUZHILEI <2925212608@qq.com> --- assets/execute_logic.png | Bin 45869 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 assets/execute_logic.png diff --git a/assets/execute_logic.png b/assets/execute_logic.png deleted file mode 100644 index fc116808f9f132b1f154b9f9d3a5e2fd33841b7e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 45869 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: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�U*o} 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 From a61660f7e788d7c7a90a57cf52df481ed71712dd Mon Sep 17 00:00:00 2001 From: QIUZHILEI <2925212608@qq.com> Date: Mon, 17 Jul 2023 09:30:15 +0800 Subject: [PATCH 3/3] optimize code Signed-off-by: QIUZHILEI <2925212608@qq.com> --- src/engine/graph.rs | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/engine/graph.rs b/src/engine/graph.rs index 23a7861..40b4ab9 100644 --- a/src/engine/graph.rs +++ b/src/engine/graph.rs @@ -114,9 +114,7 @@ impl Graph { }) .count(); - while !queue.is_empty() { - let v = queue.pop().unwrap(); // This unwrap is ok since `queue` is not empty - + while let Some(v)=queue.pop() { sequence.push(v); count += 1;