|
|
|
@ -68,7 +68,7 @@ loop {
|
|
|
|
|
|
|
|
|
|
不过,如果 Rust 真的将代码精确地编译成那样,那么每一个 `await` 都会变成阻塞操作 -- 这恰恰与我们的目标相反!相反,Rust 确保循环可以将控制权交给一些可以暂停当前 future 转而去处理其它 future 并在之后再次检查当前 future 的内容。如你所见,这就是异步运行时,这种安排和协调的工作是其主要工作之一。
|
|
|
|
|
|
|
|
|
|
在本章前面的内容中,我们描述了等待 `rx.recv`。`recv` 调用返回一个 future,并 await 轮询它的 future。我们注意到运行时会暂停 future ,直到它就绪并返回 `Some(message)` ,或是信道关闭时返回 `None` 为止。随着我们对 `Future` trait,尤其是 `Future::poll` 的理解的深入,我们可以看出其是如何工作的。当返回 `Poll::Pending` 时,运行时知道 future 还没有准备就绪。反过来说,当 `poll` 返回 `Poll::Ready(Some(message))` 或 `Poll::Ready(None)` 时运行时知道 future **已经** 准备就绪,并将其推进。
|
|
|
|
|
在本章前面的内容中,我们描述了等待 `rx.recv`。`recv` 调用返回一个 future,并 await 轮询它的 future。我们注意到运行时会暂停 future,直到它就绪并返回 `Some(message)` ,或是信道关闭时返回 `None` 为止。随着我们对 `Future` trait,尤其是 `Future::poll` 的理解的深入,我们可以看出其是如何工作的。当返回 `Poll::Pending` 时,运行时知道 future 还没有准备就绪。反过来说,当 `poll` 返回 `Poll::Ready(Some(message))` 或 `Poll::Ready(None)` 时运行时知道 future **已经** 准备就绪,并将其推进。
|
|
|
|
|
|
|
|
|
|
运行时如何工作的具体细节超出了本书的范畴。不过关键在于理解 future 的基本机制:运行时**轮询**其所负责的每一个 future,在它们还没有完成时使其休眠。
|
|
|
|
|
|
|
|
|
|