From b99273a7a30b45f318dbcb38caadcffbae66ce78 Mon Sep 17 00:00:00 2001 From: qwer252 Date: Mon, 9 Jun 2025 18:03:39 +0800 Subject: [PATCH 1/5] Update ch17-01-futures-and-syntax.md --- src/ch17-01-futures-and-syntax.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ch17-01-futures-and-syntax.md b/src/ch17-01-futures-and-syntax.md index cb762ba..0b68361 100644 --- a/src/ch17-01-futures-and-syntax.md +++ b/src/ch17-01-futures-and-syntax.md @@ -206,7 +206,7 @@ enum Either { } ``` -`race` 函数返回 `Left`,如果第一个参数先完成,并包含该 future 的输出,如果 *第二个* future 先完成,则返回 `Right` 和第二个 future 的输出。这匹配调用函数时参数出现的顺序:第一个参数在第二个参数的左边。 +如果第一个参数先完成,`race` 函数返回 `Left` 并包含该 future 的输出,如果第二个 future 先完成,则返回 `Right` 和第二个 future 的输出。这匹配调用函数时参数出现的顺序:第一个参数在第二个参数的左边。 我们还更新了 `page_title` 来返回与传递时相同的 URL。如此如果首先返回的页面没有可以解析的 ``,仍然可以打印出有意义的信息。有了这些信息,我们对 `println!` 的输出进行了封装和更新,以表明哪个 URL 最先完成,并在页面有 `<title>` 时打印出它的内容。 From c0d66ef587ee15774fa8d219867c89d301d365eb Mon Sep 17 00:00:00 2001 From: qwer252 <wq33392@gmail.com> Date: Mon, 9 Jun 2025 21:34:16 +0800 Subject: [PATCH 2/5] Update ch17-03-more-futures.md --- src/ch17-03-more-futures.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ch17-03-more-futures.md b/src/ch17-03-more-futures.md index 1d665b5..dd15663 100644 --- a/src/ch17-03-more-futures.md +++ b/src/ch17-03-more-futures.md @@ -272,7 +272,7 @@ received 'you' 回忆一下[第一个异步程序][async-program]中提到在每一个 await point,如果被 await 的 future 还没有就绪,Rust 会给运行时一个机会来暂停该任务并切换到另一个任务。反过来也是正确的:Rust *只会* 在一个 await point 暂停异步代码块并将控制权交还给运行时。await points 之间的一切都是同步的。 -这意味着如果你在异步代码块中做了一堆工作而没有一个 await point,则那个 future 会阻塞其它任何 future 继续进行。有时你可能会听说这称为一个 future *starving* 其它 future。在一些情况中,这可能不是什么大问题。不过,如果你在进行某种昂贵的设置或者长时间运行的任务,亦或有一个 future 会无限持续运行某些特定任务的话,你会需要思考在何时何地将控制权交还运行时。 +这意味着如果你在异步代码块中做了一堆工作而没有一个 await point,则那个 future 会阻塞其它任何 future 继续进行。有时你可能会听说这称为一个 future *饿死*(starving)其它 future。在一些情况中,这可能不是什么大问题。不过,如果你在进行某种昂贵的设置或者长时间运行的任务,亦或有一个 future 会无限持续运行某些特定任务的话,你会需要思考在何时何地将控制权交还运行时。 同样地,如果你有长时间运行的阻塞操作,异步可能是一个提供了将程序的不同部分相互关联起来的实用工具。 From 47f107c3d166b33d36ea7aeed4f24ac535cf5a1f Mon Sep 17 00:00:00 2001 From: qwer252 <wq33392@gmail.com> Date: Mon, 9 Jun 2025 21:49:39 +0800 Subject: [PATCH 3/5] Update ch17-03-more-futures.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 或许这样更好听点 --- src/ch17-03-more-futures.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ch17-03-more-futures.md b/src/ch17-03-more-futures.md index dd15663..5c4586a 100644 --- a/src/ch17-03-more-futures.md +++ b/src/ch17-03-more-futures.md @@ -272,7 +272,7 @@ received 'you' 回忆一下[第一个异步程序][async-program]中提到在每一个 await point,如果被 await 的 future 还没有就绪,Rust 会给运行时一个机会来暂停该任务并切换到另一个任务。反过来也是正确的:Rust *只会* 在一个 await point 暂停异步代码块并将控制权交还给运行时。await points 之间的一切都是同步的。 -这意味着如果你在异步代码块中做了一堆工作而没有一个 await point,则那个 future 会阻塞其它任何 future 继续进行。有时你可能会听说这称为一个 future *饿死*(starving)其它 future。在一些情况中,这可能不是什么大问题。不过,如果你在进行某种昂贵的设置或者长时间运行的任务,亦或有一个 future 会无限持续运行某些特定任务的话,你会需要思考在何时何地将控制权交还运行时。 +这意味着如果你在异步代码块中做了一堆工作而没有一个 await point,则那个 future 会阻塞其它任何 future 继续进行。有时你可能会听说这称为一个 future 导致其它 future *饥饿*(starving)。在一些情况中,这可能不是什么大问题。不过,如果你在进行某种昂贵的设置或者长时间运行的任务,亦或有一个 future 会无限持续运行某些特定任务的话,你会需要思考在何时何地将控制权交还运行时。 同样地,如果你有长时间运行的阻塞操作,异步可能是一个提供了将程序的不同部分相互关联起来的实用工具。 From 336c7e033de582556c14c06e816e75eb42ef990d Mon Sep 17 00:00:00 2001 From: qwer252 <wq33392@gmail.com> Date: Mon, 9 Jun 2025 21:55:27 +0800 Subject: [PATCH 4/5] Update ch17-03-more-futures.md --- src/ch17-03-more-futures.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ch17-03-more-futures.md b/src/ch17-03-more-futures.md index 5c4586a..8b29cc2 100644 --- a/src/ch17-03-more-futures.md +++ b/src/ch17-03-more-futures.md @@ -272,7 +272,7 @@ received 'you' 回忆一下[第一个异步程序][async-program]中提到在每一个 await point,如果被 await 的 future 还没有就绪,Rust 会给运行时一个机会来暂停该任务并切换到另一个任务。反过来也是正确的:Rust *只会* 在一个 await point 暂停异步代码块并将控制权交还给运行时。await points 之间的一切都是同步的。 -这意味着如果你在异步代码块中做了一堆工作而没有一个 await point,则那个 future 会阻塞其它任何 future 继续进行。有时你可能会听说这称为一个 future 导致其它 future *饥饿*(starving)。在一些情况中,这可能不是什么大问题。不过,如果你在进行某种昂贵的设置或者长时间运行的任务,亦或有一个 future 会无限持续运行某些特定任务的话,你会需要思考在何时何地将控制权交还运行时。 +这意味着如果你在异步代码块中做了一堆工作而没有一个 await point,则那个 future 会阻塞其它任何 future 继续进行。有时你可能会听说这称为一个 future 导致其它 future *饥饿*(starving) 。在一些情况中,这可能不是什么大问题。不过,如果你在进行某种昂贵的设置或者长时间运行的任务,亦或有一个 future 会无限持续运行某些特定任务的话,你会需要思考在何时何地将控制权交还运行时。 同样地,如果你有长时间运行的阻塞操作,异步可能是一个提供了将程序的不同部分相互关联起来的实用工具。 From 6b3bee2d9f092170aab43cd385771a9666181de4 Mon Sep 17 00:00:00 2001 From: qwer252 <wq33392@gmail.com> Date: Mon, 9 Jun 2025 23:11:04 +0800 Subject: [PATCH 5/5] Update ch17-04-streams.md --- src/ch17-04-streams.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ch17-04-streams.md b/src/ch17-04-streams.md index 339ead5..dfd5e89 100644 --- a/src/ch17-04-streams.md +++ b/src/ch17-04-streams.md @@ -168,7 +168,7 @@ Message: 'j' 在 `get_messages` 中,我们在 `messages` 数组上使用 `enumerate` 迭代器方法以便能够同时获得项本身和其索引。然后我们为偶数索引的项引入 100 毫秒的延时并为奇数索引的项引入 300 毫秒的延时来模拟真实世界的消息流中可能出现的不同的延时。因为我们的延时为 200 毫秒,这应该会影响到其中一半的消息。 -为了在 `get_messages` 函数中实现消息间的延迟且不造成阻塞,我们需要使用异步。然而,我们不能将 `get_messages` 函数本身变为异步函数,因为这样它会返回一个 `Future<Output = Stream<Item = String>>` 而不是 `Stream<Item = String>>`。调用者则不得不 await `get_messages` 本身来获取流。不过请记住:在一个给定的 future 中的一切都是线性发生的;并发发生在 futures **之间**。await `get_messages` 会要求其在返回接收端流之前发送所有的消息,包括消息之间的休眠延时。其结果是,超时将毫无用处。流本身没有任何的延时;它们甚至全都发生在流可用之前。 +为了在 `get_messages` 函数中实现消息间的延迟且不造成阻塞,我们需要使用异步。然而,我们不能将 `get_messages` 函数本身变为异步函数,因为这样它会返回一个 `Future<Output = Stream<Item = String>>` 而不是 `Stream<Item = String>`。调用者则不得不 await `get_messages` 本身来获取流。不过请记住:在一个给定的 future 中的一切都是线性发生的;并发发生在 futures **之间**。await `get_messages` 会要求其在返回接收端流之前发送所有的消息,包括消息之间的休眠延时。其结果是,超时将毫无用处。流本身没有任何的延时;它们甚至全都发生在流可用之前。 相反,我们保持 `get_messages` 为一个返回流的常规函数,并 spawn 一个任务来处理异步 `sleep` 调用。