update ch17-05

main
kazeno 3 days ago
parent ac3540e947
commit 6f27c94261

@ -4,7 +4,7 @@
> <br>
> commit 56ec353290429e6547109e88afea4de027b0f1a9
贯穿本章,我们通过多种方式使用了 `Future`、`Pin`、`Unpin`、`Stream` 和 `StreamExt` trait。但是直到目前为止我们避免过多地了解它们如何工作或者如何组合在一起的细节这对你大多数的日常 Rust 开发是可以的。不过有时你会遇到需要了解更多细节的场景。在本小节,我们会足够深入以便理解这些场景,并仍会将 *真正* 有深度的内容留给其它文档。
贯穿本章,我们通过多种方式使用了 `Future`、`Pin`、`Unpin`、`Stream` 和 `StreamExt` trait。但是直到目前为止我们避免过多地了解它们如何工作或者如何组合在一起的细节这对你日常的 Rust 开发而言通常是没问题的。不过有时你会遇到需要了解更多细节的场景。在本小节,我们会足够深入以便理解这些场景,并仍会将 *真正* 有深度的内容留给其它文档。
### `Future` trait
@ -21,9 +21,9 @@ pub trait Future {
}
```
trait 定义中包含一些的新类型和我们之前没有见过新语法,所以让我们一点一点地过一遍这个定义。
trait 定义中包含一些的新类型和我们之前没有见过新语法,所以让我们逐步详细地解析一下这个定义。
第一, `Future` 的关联类型 `Output` 表明 future 所生成的类型。这类似于 `Iterator` trait 的关联类型 `Item`。第二`Future` 还有一个 `poll` 方法,其有一个特殊的 `self` 参数的 `Pin` 引用和一个 `Context` 类型的可变引用,并返回一个 `Poll<Self::Output>`。稍后我们再细说 `Pin``Context`。现在让我们专注于方法返回的 `Poll` 类型:
首先, `Future` 的关联类型 `Output` 表明 future 最终解析出的类型。这类似于 `Iterator` trait 的关联类型 `Item`。其次`Future` 还有一个 `poll` 方法,其有一个特殊的 `self` 参数的 `Pin` 引用和一个 `Context` 类型的可变引用,并返回一个 `Poll<Self::Output>`。稍后我们再细说 `Pin``Context`。现在让我们专注于方法返回的 `Poll` 类型:
```rust
enum Poll<T> {
@ -50,7 +50,7 @@ match page_title(url).poll() {
}
```
如果 future 仍然是 `Pending` 的话我们应该做什么呢?我们需要一些方法来反复尝试并直到 future 最终结束。换句话说,我们需要一个循环:
如果 future 仍然是 `Pending` 的话我们应该做什么呢?我们需要某种方式不断重试,直到 future 最终准备好。换句话说,我们需要一个循环:
```rust,ignore
let mut page_title_fut = page_title(url);
@ -67,4 +67,10 @@ loop {
}
```
但是如何 Rust 将其编译为正好如此的代码的话,每一个 `await` 都会阻塞 -- 这完全与我们期望的相反!
但是如何 Rust 将其编译为正好如此的代码的话,每一个 `await` 都会阻塞 -- 这与我们期望的完全不同相反Rust 确保循环可以将控制权交给一些可以暂停当前 future 并处理其它 future 并在之后再次检查的内容。如你所见,它就是异步运行时,这种安排和协调的工作是其主要工作之一。
在本章的开头,我们描述了等待 `rx.recv`。`recv` 调用返回一个 future并等待轮询它的 future。我们注意到当信道关闭时运行时会暂停 future 直到它就绪并返回 `Some(message)``None`。随着我们对 `Future` trait尤其是 `Future::poll` 的理解的深入,我们可以看出其是如何工作的。运行时知道 future 返回 `Poll::Pending` 时没有完成。反过来说,当 `poll` 返回 `Poll::Ready(Some(message))``Poll::Ready(None)` 时运行时知道 future **已经**完成了并继续运行。
运行时如何工作的具体细节超出了本书的范畴。不过关键在于理解 future 的基本机制:运行时**轮询**其所负责的每一个 future在它们还没有完成时使其休眠。
### `Pin``Unpin` traits

Loading…
Cancel
Save