diff --git a/src/SUMMARY.md b/src/SUMMARY.md index 4d39c08..80f13a1 100644 --- a/src/SUMMARY.md +++ b/src/SUMMARY.md @@ -166,13 +166,14 @@ - [异步 async](async/index.md) - [第一个 async 程序](async/async-dance.md) - [理解 Futures 与 Tasks](async/futures-and-tasks.md) + - [标准库中的 future 模块](async/future-module.md) + - [标准库中的 task 模块](async/task-module.md) - [理解 async/await](async/async-await.md) - [生命周期与内存保持 Lifetimes and Pinning](async/lifetimes-pinning.md) - [一次执行多个 Futures](async/multi-futures.md) - - [标准库中的 future 模块](async/future-module.md) - [futures 库](async/futures-crate.md) - [mio 库](async/mio.md) - - [运行时](async/runtime.md) + - [async 运行时](async/runtime.md) - [tokio 库](async/runtime/tokio.md) - [async-std 库](async/runtime/async-std.md) - [smol 库](async/runtime/smol.md) diff --git a/src/async/.$async-dance.drawio.bkp b/src/async/.$async-dance.drawio.bkp index f75f5c8..f3b7fc4 100644 --- a/src/async/.$async-dance.drawio.bkp +++ b/src/async/.$async-dance.drawio.bkp @@ -1,27 +1,35 @@ - + - + - - + + + + - - + + - - + + - - - - + - + + + + + + + + + + diff --git a/src/async/.$future-and-task.drawio.bkp b/src/async/.$future-and-task.drawio.bkp new file mode 100644 index 0000000..59c0ae7 --- /dev/null +++ b/src/async/.$future-and-task.drawio.bkp @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/async/async-dance.drawio b/src/async/async-dance.drawio index b39d748..92dd305 100644 --- a/src/async/async-dance.drawio +++ b/src/async/async-dance.drawio @@ -1,26 +1,34 @@ - + - + - - + + + + - - + + - - + + - - - - + - - + + + + + + + + + + + diff --git a/src/async/async-dance.md b/src/async/async-dance.md index 53c36c0..939d23c 100644 --- a/src/async/async-dance.md +++ b/src/async/async-dance.md @@ -78,6 +78,6 @@ fn main() { } ``` -其中 `futures::join!()` 宏, 类似于 `.await`, 但它等待多个 futures 对象并发运行, 大致如下图如示: +其中 `futures::join!()` 宏, 类似于 `.await`, 但它等待多个 Future 对象并发运行, 大致如下图如示: ![futures join](async-dance.png) \ No newline at end of file diff --git a/src/async/async-dance.png b/src/async/async-dance.png index 2df9fa6..05f78e2 100644 Binary files a/src/async/async-dance.png and b/src/async/async-dance.png differ diff --git a/src/async/future-and-task.drawio b/src/async/future-and-task.drawio new file mode 100644 index 0000000..4764490 --- /dev/null +++ b/src/async/future-and-task.drawio @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/async/future-and-task.png b/src/async/future-and-task.png new file mode 100644 index 0000000..54b33e1 Binary files /dev/null and b/src/async/future-and-task.png differ diff --git a/src/async/future-module.md b/src/async/future-module.md index 43298db..10052f7 100644 --- a/src/async/future-module.md +++ b/src/async/future-module.md @@ -1,3 +1,3 @@ # 标准库中的 future 模块 -## Waker 与 RawWaker \ No newline at end of file +## `IntoFuture` trait \ No newline at end of file diff --git a/src/async/futures-and-tasks.md b/src/async/futures-and-tasks.md index 348a73f..c785dfe 100644 --- a/src/async/futures-and-tasks.md +++ b/src/async/futures-and-tasks.md @@ -1,4 +1,36 @@ # 理解 Futures 与 Tasks +这节主要讲解 `Future` trait 以及异步任务如何被调度的. +它们分别属于 `std::future` 和 `std::task` 模块, 这两个模块分在后面两节有详细的介绍. + +## `Future` trait + 在同步式的代码 (synchronous code) 里调用阻塞函数(blocking function), 会阻塞整个线程; -而在异步式的代码里, `Future` 会把控制权返还给线程, 这样其它的 `Future` 就可以运行了. \ No newline at end of file +而在异步式的代码里, `Future` 会把控制权返还给线程, 这样其它的 `Future` 就可以运行了. + +它位于 `std::future`, `async fn` 会返回一个`Future` 对象, 它的接口定义如下: + +```rust +pub trait Future { + type Output; + fn poll(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll; +} +``` + +通过调用 `poll()` 方法, 可以将 `Future` 对象向前推近到新的进度, 尽量接近任务完成状态. +当 `Future` 对象完成后, 它返回 `Poll::Ready(result)` 结果; 如果还没完成, 就返回 `Poll::Pending`. +然后当 `Future` 可以推进到新的进度时, 它会调用 `Wake::wake()` 函数. +当 `wake()` 被调用后, 运行时会再次调用 `Future` 的 `poll()` 方法, 这样就可以更新进度了. + +![future-and-task](future-and-task.png) + +## `Poll` 枚举类 + +它位于 `std::task`, 定义如下: + +```rust +pub enum Poll { + Ready(T), + Pending, +} +``` \ No newline at end of file diff --git a/src/async/task-module.md b/src/async/task-module.md new file mode 100644 index 0000000..87f1fec --- /dev/null +++ b/src/async/task-module.md @@ -0,0 +1,5 @@ +# 标准库中的 task 模块 + +## `Wake` trait + +## Waker 与 RawWaker