From 9ca97d1c1945a8eac6f9f203266eb727e9ceeab8 Mon Sep 17 00:00:00 2001 From: MingyuChen Date: Tue, 27 Jun 2023 16:50:55 +0800 Subject: [PATCH] enhance readme. adds inner relationships between crates. Signed-off-by: MingyuChen --- README.md | 15 +++- README_zh.md | 18 ++++- figure/structure.png | Bin 13454 -> 0 bytes figures/inner_dependencies.png | Bin 0 -> 8876 bytes figures/structure.png | Bin 0 -> 15383 bytes ylong_ffrt/Cargo.toml | 8 +- ylong_io/Cargo.toml | 9 +-- ylong_io/README.md | 78 ------------------ ylong_runtime/Cargo.toml | 7 +- ylong_runtime/README.md | 105 ------------------------ ylong_runtime/README_zh.md | 110 -------------------------- ylong_runtime_macros/Cargo.toml | 5 +- ylong_runtime_macros/README_en.md | 127 ------------------------------ 13 files changed, 38 insertions(+), 444 deletions(-) delete mode 100644 figure/structure.png create mode 100644 figures/inner_dependencies.png create mode 100644 figures/structure.png delete mode 100644 ylong_io/README.md delete mode 100644 ylong_runtime/README.md delete mode 100644 ylong_runtime/README_zh.md delete mode 100644 ylong_runtime_macros/README_en.md diff --git a/README.md b/README.md index 49b496c..29d5997 100644 --- a/README.md +++ b/README.md @@ -4,16 +4,23 @@ Rust asynchronous runtime, provides functionalities such as spawning async tasks, async io, synchronization, parallel calculation. ### Overall structure -![structure](./figure/structure.png) +![structure](./figures/structure.png) +### Crates inner relations +![inner_dependencies](./figures/inner_dependencies.png) + +ylong_runtime depends on the other three crates. +- ylong_io: provides event-driven net io, using epoll or iocp to achieve non-blocking tcp or udp +- ylong_ffrt: provides function flow runtime APIs. It serves as an alternative scheduler for ylong_runtime. +- ylong_macros: provides procedural macros for `select!` and ``main``/``test``. ## Compile Build Method 1: Introduce ylong_runtime in Cargo.toml ```toml -#[dependence] -ylong_runtime = { git = "https://gitee.com/openharmony-sig/commonlibrary_rust_ylong_runtime.git", version = "1.9.0", features = ["full"]} +#[dependencies] +ylong_runtime = { git = "https://gitee.com/openharmony-sig/commonlibrary_rust_ylong_runtime.git", features = ["full"]} ``` For compiling FFRT version of ylong_runtime, rename ``ylong_ffrt/build_ffrt.rs`` to ``ylong_ffrt/build.rs``, and export `LD_LIBRARY_PATH` @@ -27,6 +34,8 @@ deps += ["//commonlibrary/rust/ylong_runtime/ylong_runtime:lib"] ## directory ``` ylong_runtime +|── docs # User guide +|── figures # Structure figures in docspo |── ylong_ffrt | └── src # FFRT rust ffi |── ylong_io diff --git a/README_zh.md b/README_zh.md index 002b47d..50cb893 100644 --- a/README_zh.md +++ b/README_zh.md @@ -1,14 +1,24 @@ # ylong_runtime ## 简介 -Rust异步运行时库,用于生成并执行异步任务。主要分为Time, Sync, Parallel calculation, IO四个模块。 +Rust异步运行时库,用于生成并执行异步任务。同时提供了异步网络IO,异步文件IO,定时器,同步原语,并行迭代器等功能。 ### 图一 整体架构图 -![structure](./figure/structure.png) +![structure](./figures/structure.png) + +### 图二 模块间关系 +![inner_dependencies](./figures/inner_dependencies.png) + +ylong_runtime 依赖以下三个库 +- ylong_io: 提供了事件驱动型网络IO,通过epoll或iocp实现了非阻塞性的tcp和udp。 +- ylong_ffrt: 提供了Function Flow Runtime的接口,可作为ylong_runtime的底层调度器。 +- ylong_macros: 提供了ylong_runtime所需的过程宏功能,用于`select!`功能, 以及`main`/`test`。 ## 目录 ``` ylong_runtime +|── docs # 使用文档 +|── figures # 架构图 |── ylong_ffrt | └── src # FFRT ffi封装 |── ylong_io @@ -49,8 +59,8 @@ ylong_runtime 方法一:在Cargo.toml中引入ylong_runtime ```toml -#[dependence] -ylong_runtime = { git = "https://gitee.com/openharmony-sig/commonlibrary_rust_ylong_runtime.git", version = "1.9.0", features = ["full"]} +#[dependencies] +ylong_runtime = { git = "https://gitee.com/openharmony-sig/commonlibrary_rust_ylong_runtime.git", features = ["full"]} ``` 如果需要编译ffrt版本,将ylong_ffrt目录下的``build_ffrt.rs``文件重命名为``build.rs``, 并设置`LD_LIBRARY_PATH` diff --git a/figure/structure.png b/figure/structure.png deleted file mode 100644 index 6a396e5bedeab83834ea7116da40c9e2c4eb822b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13454 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 UgGqJZJtL5;w31ZW)7S6+A3vuR#{d8T diff --git a/figures/inner_dependencies.png b/figures/inner_dependencies.png new file mode 100644 index 0000000000000000000000000000000000000000..c0503d1289cdb90970489f50c72cecc13afd22a7 GIT binary patch literal 8876 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 A4gdfE literal 0 HcmV?d00001 diff --git a/figures/structure.png b/figures/structure.png new file mode 100644 index 0000000000000000000000000000000000000000..1234e3c41369ac4d2b63d5a091e0e40057050b14 GIT binary patch literal 15383 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 W$5BhcUJo?"] +version = "1.0.0" edition = "2021" -description = "Runtime Environment" +description = "FFRT adapter" license = "Apache-2.0" -readme = "README.md" -repository = "https://open.codehub.huawei.com/innersource/Ylong_Rust/ylong_rs/files?ref=ylong_oh&filePath=src%2Fruntime%2Fylong_ffrt" +repository = "https://gitee.com/openharmony-sig/commonlibrary_rust_ylong_runtime" keywords = ["ylong", "ffrt"] # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html diff --git a/ylong_io/Cargo.toml b/ylong_io/Cargo.toml index 2b9424f..0ca5bc5 100644 --- a/ylong_io/Cargo.toml +++ b/ylong_io/Cargo.toml @@ -1,11 +1,10 @@ [package] name = "ylong_io" -version = "0.1.0" -edition = "2018" -description = "IO module of YLong" -readme = "README.md" +version = "1.0.0" +edition = "2021" +description = "Event Driven IO" license = "Apache-2.0" -repository = "https://open.codehub.huawei.com/innersource/Ylong_Rust/ylong_rs/files?ref=master&filePath=src%2Fschedule%2Fylong_io" +repository = "https://gitee.com/openharmony-sig/commonlibrary_rust_ylong_runtime" keywords = ["ylong", "io", "epoll"] # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html diff --git a/ylong_io/README.md b/ylong_io/README.md deleted file mode 100644 index ea633db..0000000 --- a/ylong_io/README.md +++ /dev/null @@ -1,78 +0,0 @@ -## ylong_io 介绍 -提供通信 io 功能,底层实现使用 epoll。 - -### 功能介绍 -- 支持 tcp 协议: - - 支持使用 tcp 协议进行通信,并使用 epoll 进行异步 io。 - -### 使用实例 -TCP 通信实例 - -``` -use std::collections::HashMap; -use std::io; -use std::io::{Read, Write}; -use ylong_io::{EventTrait, Events, Interest, Poll, TcpListener, Token}; - -// 唯一标识 SEVER 的 Token -const SERVER: Token = Token(0); - -fn main() -> io::Result<()> { - // 创建 Poll 实例,用于 epoll 查找事件。 - let poll = Poll::new()?; - - // 设置本地地址,并 bind 本地端口,得到 fd。 - let addr = "127.0.0.1:1234".parse().unwrap(); - let mut server = TcpListener::bind(addr)?; - - // 将 server 的 fd 注册到 epoll 中进行监听,监听可读事件。 - poll.register(&mut server, SERVER, Interest::READABLE)?; - let mut events = Events::with_capacity(128); - - // 保存远端传来的链接。 - let mut connections = HashMap::new(); - // 远端传来的 socket fd 用从 1 开始的计数标号。 - let mut unique_token = Token(SERVER.0 + 1); - - // 事件循环 - loop { - // 检查是否有事件到来。 - poll.poll(&mut events, None)?; - - for event in events.iter() { - // server 有事件到来,说明远端有新连接到来。 - if SERVER == event.token() { - let (mut stream, addr) = server.accept()?; - - // 设置Token。 - let token = Token(unique_token.0 + 1); - unique_token = Token(unique_token.0 + 1); - // 注册到 epoll 中监听。 - poll.register( - &mut stream, - token, - Interest::READABLE.add(Interest::WRITABLE), - )?; - // 添加到数据结构中进行保存。 - connections.insert(token, stream); - } else { - // 通过唯一标识查找连接。 - match connections.get_mut(&event.token()) { - //... 执行通信相关的逻辑 - } - None => break, - } - } - } - } -} - - ``` - -### 如何使用 -在 Cargo.toml 文件中添加 dependencies 即可 -``` -[dependencies] -ylong_io = "0.1.0" -``` \ No newline at end of file diff --git a/ylong_runtime/Cargo.toml b/ylong_runtime/Cargo.toml index d69b5aa..ec3cac2 100644 --- a/ylong_runtime/Cargo.toml +++ b/ylong_runtime/Cargo.toml @@ -1,11 +1,10 @@ [package] name = "ylong_runtime" -version = "1.9.0" -edition = "2018" +version = "1.0.0" +edition = "2021" description = "Runtime Environment" license = "Apache-2.0" -readme = "README.md" -repository = "https://open.codehub.huawei.com/innersource/Ylong_Rust/ylong_rs/files?ref=master&filePath=src%2Fschedule%2Fylong_runtime" +repository = "https://gitee.com/openharmony-sig/commonlibrary_rust_ylong_runtime" keywords = ["ylong", "runtime", "executor"] # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html diff --git a/ylong_runtime/README.md b/ylong_runtime/README.md deleted file mode 100644 index ef6414e..0000000 --- a/ylong_runtime/README.md +++ /dev/null @@ -1,105 +0,0 @@ -# ylong_runtime - -## Introduction -Rust language doesn't provide an asynchronous runtime. Instead, it provides basic primitives and functionalities such as ``async``, ``await``, ``Future``, and ``Waker``. Therefore, it's users' responsibilities to implement the runtime, or choose from an existing third party's runtime. - -## Compile Build - -1. Introduce ylong_runtime in Cargo.toml - -```toml -#[dependence] -ylong_runtime = { git = "https://gitee.com/openharmony-sig/commonlibrary_rust_ylong_runtime.git", version = "1.9.0", features = ["full"]} -``` - -2. Add dependencies to BUILD.gn where appropriate - -``` -deps += ["//commonlibrary/rust/ylong_runtime/ylong_runtime:ylong_runtime"] -``` - - - -## Usage - -### `ylong` global thread pool -```rust -use std::net::{Ipv4Addr, SocketAddrV4}; -use ylong_runtime::io::*; -use ylong_runtime::net::TcpListener; -fn main() -> std::io::Result<()> { - ylong_runtime::block_on(async { - let ip = Ipv4Addr::new(127, 0, 0, 1); - let addr = SocketAddrV4::new(ip, 8080); - let listener = TcpListener::bind(addr.into()).await?; - loop { - let (mut stream, _) = listener.accept().await?; - stream.write_all("hello ylong".as_bytes()); - } - }) -} -``` - - -#### Thread pool settings - -Users can set the config of the runtime, which must be set before `block_on` and `spawn`, otherwise `runtime` will use the default configuration. - -```rust -fn main() { - let _ = ylong_runtime::builder::RuntimeBuilder::new_multi_thread() - .worker_stack_size(10) - .keep_alive_time(std::time::Duration::from_secs(10)) - .build_global(); - - let fut = async { - - }; - let _ = ylong_runtime::block_on(fut); -} -``` - -### `ylong` scheduling framework non-asynchronous thread pool (spawn_blocking) - -```rust -fn main() { - let fut = async { - // It could be a closure or function. - let join_handle = runtime.spawn_blocking(|| {}); - // Waits the task until finished. - let _result = join_handle.await; - }; - let _ = ylong_runtime::block_on(fut); -} -``` - - -### ParIter Introduction - -ParIter and its related interfaces are defined in the module `ylong_runtime::iter`. `ParIter` supports parallel iterations over threads, where a set of data is split and the split data performs the operations in the iterator in parallel over the threads. - -```rust -use ylong_runtime::iter::prelude::*; - -fn main() { - ylong_runtime::block_on(fut()); -} - -async fn fut() { - let v = (1..30).into_iter().collect::>(); - let sum = v.par_iter().map(|x| fibbo(*x)).sum().await.unwrap(); - println!("{}", sum); -} - -fn fibbo(i: usize) -> usize { - match i { - 0 => 1, - 1 => 1, - n => fibbo(n - 1) + fibbo(n - 2), - } -} -``` - -## Acknowledgements - -Based on the user's habit, the API of this library, after changing the original Rust standard library synchronous interface implementation to asynchronous, retains the original naming style of the standard library, such as``TcpStream::connect``, ``File::read``, ``File::write`` and so on. We also refer to some of Tokio's general API design ideas, and we would like to express our gratitude to the Rust standard library and Tokio \ No newline at end of file diff --git a/ylong_runtime/README_zh.md b/ylong_runtime/README_zh.md deleted file mode 100644 index 03deb83..0000000 --- a/ylong_runtime/README_zh.md +++ /dev/null @@ -1,110 +0,0 @@ -# ylong_runtime - -## 简介 -Rust语言在提供了``async``/``await``, ``Future``, ``Waker``等异步基础组件的同时,并不提供具体的异步运行时实现。而具体实现则需要用户自己构建,或者使用社区已构建好的异步运行时。这样的好处是用户可以在自己的使用场景做定制化的优化。 - -## 编译构建 - -1. 在Cargo.toml中引入ylong_runtime - -```toml -#[dependence] -ylong_runtime = { git = "https://gitee.com/openharmony-sig/commonlibrary_rust_ylong_runtime.git", version = "1.9.0", features = ["full"]} -``` - -2. 在 BUILD.gn 合适的地方添加依赖 - -``` -deps += ["//commonlibrary/rust/ylong_runtime/ylong_runtime:ylong_runtime"] -``` - -## 使用说明 - -### `ylong` 全局线程池 - -```rust -use std::net::{Ipv4Addr, SocketAddrV4}; -use ylong_runtime::io::*; -use ylong_runtime::net::TcpListener; -fn main() -> std::io::Result<()> { - ylong_runtime::block_on(async { - let ip = Ipv4Addr::new(127, 0, 0, 1); - let addr = SocketAddrV4::new(ip, 8080); - let listener = TcpListener::bind(addr.into()).await?; - loop { - let (mut stream, _) = listener.accept().await?; - stream.write_all("hello ylong".as_bytes()); - } - }) -} - -``` - -#### 线程池设置 - -可以链式设置runtime的具体配置。必须在`block_on`,`spawn`之前设置,否则`runtime`会使用默认配置。 - -```rust -fn main() { - let _ = ylong_runtime::builder::RuntimeBuilder::new_multi_thread() - .worker_stack_size(10) - .keep_alive_time(std::time::Duration::from_secs(10)) - .build_global(); - - let fut = async { - - }; - let _ = ylong_runtime::block_on(fut); -} -``` - - - -### `ylong` 调度框架非异步线程池(spawn_blocking)使用 - -```rust -fn main() { - let fut = async { - // 这里可以是闭包也可以是函数。 - let join_handle = ylong_runtime::spawn_blocking(|| {}); - // 等待任务执行完成 - let _result = join_handle.await; - }; - let _ = ylong_runtime::block_on(fut); -} - -``` - - - -### ParIter 功能介绍 - -`ParIter` 及其相关接口定义于模块 `ylong_runtime::iter`,`ParIter`支持数据在线程中做并行迭代,一组数据会在线程中被分割,分割后的数据会在线程中并行执行迭代器中的操作。 - -```rust -use ylong_runtime::iter::prelude::*; - -fn main() { - ylong_runtime::block_on(fut()); -} - -async fn fut() { - let v = (1..30).into_iter().collect::>(); - let sum = v.par_iter().map(|x| fibbo(*x)).sum().await.unwrap(); - println!("{}", sum); -} - -fn fibbo(i: usize) -> usize { - match i { - 0 => 1, - 1 => 1, - n => fibbo(n - 1) + fibbo(n - 2), - } -} -``` - - - -## 致谢 - -基于用户的使用习惯,本库的API在将原本Rust标准库同步的接口实现改为异步后,保留了标准库原本的命名风格,如``TcpStream::connect``、``File::read``、``File::write``等。同时也参考了Tokio的部分通用API设计思想,在此对Rust标准库和Tokio表示感谢 \ No newline at end of file diff --git a/ylong_runtime_macros/Cargo.toml b/ylong_runtime_macros/Cargo.toml index 0e21724..cf93918 100644 --- a/ylong_runtime_macros/Cargo.toml +++ b/ylong_runtime_macros/Cargo.toml @@ -1,11 +1,10 @@ [package] name = "ylong_runtime_macros" -version = "1.11.0" +version = "1.0.0" edition = "2021" description = "Ylong_runtime Procedure Macro" license = "Apache-2.0" -readme = "README.md" -repository = "https://open.codehub.huawei.com/innersource/Ylong_Rust/ylong_rs/files?ref=master&filePath=src%2Fschedule%2Fylong_runtime_macro" +repository = "https://gitee.com/openharmony-sig/commonlibrary_rust_ylong_runtime" keywords = ["Ylong", "Runtime", "Procedure", "Macro"] [lib] diff --git a/ylong_runtime_macros/README_en.md b/ylong_runtime_macros/README_en.md deleted file mode 100644 index ab28f53..0000000 --- a/ylong_runtime_macros/README_en.md +++ /dev/null @@ -1,127 +0,0 @@ -## Ylong_macro Process Macros - -#### Currently, only the internal implementation macro of the select! macro is contained. - -#### Do not use directly - -### select! Macro Usage Examples - -Basic select with two branches. - -``` - async fn do_async1() { - // do task - } - async fn do_async2() { - // do task - } - async fn select_test() { - ylong_runtime::select! { - _ = do_async1() => { - println!("do_async1() completed first"); - }, - _ = do_async2() => { - println!("do_async2() completed first"); - } - } - } -``` -Uses if to filter asynchronous tasks -``` - async fn do_async1() -> i32 { - 1 - } - async fn do_async2() -> i32 { - 2 - } - async fn do_async3() -> bool { - false - } - async fn select_test() { - let mut count = 0; - ylong_runtime::select! { - a = do_async1(), if false => { - count += a; - println!("do_async1() completed first{:?}", a); - }, - b = do_async2() => { - count += b; - println!("do_async2() completed first{:?}", b); - }, - c = do_async3(), if false => { - if c { - println!("do_async3() completed true"); - } - else { - println!("do_async3() completed false"); - } - } - } - assert_eq!(count, 2); - } - ``` -Repeated uses select! until all task return. - ``` - #[cfg(feature = "sync")] - async fn select_channel() { - let (tx1, mut rx1) = ylong_runtime::sync::oneshot::channel(); - let (tx2, mut rx2) = ylong_runtime::sync::oneshot::channel(); - - ylong_runtime::spawn(async move { - tx1.send("first").unwrap(); - }); - - ylong_runtime::spawn(async move { - tx2.send("second").unwrap(); - }); - - let mut a = None; - let mut b = None; - - while a.is_none() || b.is_none() { - ylong_runtime::select! { - v1 = (&mut rx1), if a.is_none() => a = Some(v1.unwrap()), - v2 = (&mut rx2), if b.is_none() => b = Some(v2.unwrap()), - } - } - - let res = (a.unwrap(), b.unwrap()); - - assert_eq!(res.0, "first"); - assert_eq!(res.1, "second"); - } - ``` -Uses 'biased' to execute four task in the specified sequence. - ``` - async fn select_biased() { - let mut count = 0u8; - - loop { - ylong_runtime::select! { - biased; - _ = async {}, if count < 1 => { - count += 1; - assert_eq!(count, 1); - } - _ = async {}, if count < 2 => { - count += 1; - assert_eq!(count, 2); - } - _ = async {}, if count < 3 => { - count += 1; - assert_eq!(count, 3); - } - _ = async {}, if count < 4 => { - count += 1; - assert_eq!(count, 4); - } - else => { - break; - } - } - } - - assert_eq!(count, 4); - } - ``` -### Subsequent plans to add process macros: Main \ No newline at end of file -- Gitee