From 3b512ae66eeaf1e834315227bbf95a4b3c21a727 Mon Sep 17 00:00:00 2001 From: Asahi <381848900@qq.com> Date: Tue, 13 Aug 2024 18:48:04 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E7=AC=AC=E4=B8=80=E8=8A=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .vscode/launch.json | 17 +++++++++ README.md | 7 ++++ src/bin/section1-1.rs | 21 +++++++++++ src/bin/section1-2.rs | 35 +++++++++++++++++ src/bin/section1-3.rs | 87 +++++++++++++++++++++++++++++++++++++++++++ src/bin/test.rs | 15 ++++++++ 6 files changed, 182 insertions(+) create mode 100644 .vscode/launch.json create mode 100644 README.md create mode 100644 src/bin/section1-1.rs create mode 100644 src/bin/section1-2.rs create mode 100644 src/bin/section1-3.rs create mode 100644 src/bin/test.rs diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..d1a40a4 --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,17 @@ +{ + // 使用 IntelliSense 了解相关属性。 + // 悬停以查看现有属性的描述。 + // 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "type": "lldb", + "request": "launch", + "name": "Debug", + "program": "${workspaceFolder}/target/debug/${fileBasenameNoExtension}", + + "args": [], + "cwd": "${workspaceFolder}" + } + ] +} \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..d9f0603 --- /dev/null +++ b/README.md @@ -0,0 +1,7 @@ +# rs-study-future +用来学习和模拟rust中的future,并且一步步实现一个简单的运行时库。 + +## How to run +```shell +cargo run --bin section1-1 # 运行第一节第一小节的代码 其他同理 +``` \ No newline at end of file diff --git a/src/bin/section1-1.rs b/src/bin/section1-1.rs new file mode 100644 index 0000000..d782a88 --- /dev/null +++ b/src/bin/section1-1.rs @@ -0,0 +1,21 @@ +use std::time::{Duration, Instant}; + +#[allow(dead_code)] +fn delay_task(delay_time: usize) -> impl Fn() -> () { + // 记录当前时间 + let start_time = Instant::now(); + return move || { + if Instant::now() - start_time > Duration::from_secs(delay_time as u64) { + println!("已经经过了至少: {:?}秒", delay_time); + } + }; +} + +fn main() { + let delay_seconds_time: usize = 5; + let task = delay_task(delay_seconds_time); + loop { + task(); + std::thread::sleep(Duration::from_millis(500)); // 休眠500ms + } +} diff --git a/src/bin/section1-2.rs b/src/bin/section1-2.rs new file mode 100644 index 0000000..8267f0e --- /dev/null +++ b/src/bin/section1-2.rs @@ -0,0 +1,35 @@ +use std::time::{Duration, Instant}; + +#[allow(dead_code)] +fn delay_task(delay_time: usize) -> impl Fn() -> bool { + // 记录当前时间 + let start_time = Instant::now(); + return move || { + if Instant::now() - start_time > Duration::from_secs(delay_time as u64) { + println!("已经经过了至少: {:?}秒", delay_time); + return true; + } + false + }; +} +const TIME_PIECE: usize = 500; +fn main() { + let delay_seconds_time: usize = 5; + let task01 = delay_task(delay_seconds_time); + let task02 = delay_task(delay_seconds_time * 2); + let mut task01_is_done = false; + let mut task02_is_done = false; + loop { + if !task01_is_done { + task01_is_done = task01(); + } + if !task02_is_done { + task02_is_done = task02(); + } + if task01_is_done && task02_is_done { + break; + } + std::thread::sleep(Duration::from_millis(TIME_PIECE as u64)); // 休眠500ms + } + println!("退出主线程!"); +} diff --git a/src/bin/section1-3.rs b/src/bin/section1-3.rs new file mode 100644 index 0000000..c406ed9 --- /dev/null +++ b/src/bin/section1-3.rs @@ -0,0 +1,87 @@ +use std::{ + borrow::BorrowMut, + cell::RefCell, + rc::Rc, + time::{Duration, Instant}, +}; + +type TaskStatus = Rc>; + +#[allow(dead_code)] +fn delay_task(delay_time: usize) -> (impl FnMut() -> (), TaskStatus) { + // 记录当前时间 + let start_time = Instant::now(); + let status = Rc::new(RefCell::new(false)); + let mut _status = status.clone(); + return ( + move || { + if !(*_status.borrow()) + && (Instant::now() - start_time > Duration::from_secs(delay_time as u64)) + { + println!("已经经过了至少: {:?}秒", delay_time); + _status.borrow_mut().replace(true); + } + }, + status.clone(), + ); +} +const TIME_PIECE: usize = 500; +pub struct Task +where + F: FnMut() -> T, +{ + task_poll_fn: F, + task_status: TaskStatus, +} +impl Task +where + F: FnMut() -> T, +{ + pub fn new(mut task_init_fn: impl FnMut() -> (F, TaskStatus)) -> Task { + let (task_poll_fn, task_status) = task_init_fn(); + Task { + task_poll_fn, + task_status, + } + } + + pub fn run(&mut self) { + if !(*self.task_status.borrow()) { + (self.task_poll_fn)(); + } + } +} + +fn event_loop(task_list: &mut Vec>) +where + F: FnMut() -> T, +{ + loop{ + let mut is_all_done = true; + for task in task_list.iter_mut() { + if !(*task.task_status.borrow()) { + is_all_done = false; + task.run(); + break; + } + } + if is_all_done { + break; + } + std::thread::sleep(Duration::from_millis(TIME_PIECE as u64)); + } + println!("事件循环退出!"); +} + +fn main() { + let mut task_list = vec![]; + let delay_seconds_time: usize = 5; + task_list.push(Task::new(move || { + return delay_task(delay_seconds_time); + })); + task_list.push(Task::new(move || { + return delay_task(delay_seconds_time * 2); + })); + event_loop(&mut task_list); + println!("退出主线程!"); +} diff --git a/src/bin/test.rs b/src/bin/test.rs new file mode 100644 index 0000000..a65e9c3 --- /dev/null +++ b/src/bin/test.rs @@ -0,0 +1,15 @@ +use std::rc::Rc; +use std::cell::RefCell; + +fn main() { + let status = Rc::new(RefCell::new(false)); // 创建一个 Rc> + + { + // 使用 borrow_mut 获取内部值的可变引用 + let mut status_mut = status.borrow_mut(); + *status_mut = true; // 通过解引用修改值 + } + + // 读取修改后的值 + println!("status: {}", *status.borrow()); +} \ No newline at end of file