From 2279eed81ad68fac5e7ee8fe8764c29d6d0f792f Mon Sep 17 00:00:00 2001 From: zongzi531 Date: Fri, 15 Apr 2022 13:22:55 +0800 Subject: [PATCH 1/2] fix: typo in tokio --- src/async-rust/tokio/getting-startted.md | 10 +++++----- src/async-rust/tokio/overview.md | 4 ++-- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/async-rust/tokio/getting-startted.md b/src/async-rust/tokio/getting-startted.md index d2459f01..342a5ca9 100644 --- a/src/async-rust/tokio/getting-startted.md +++ b/src/async-rust/tokio/getting-startted.md @@ -1,8 +1,8 @@ # tokio 初印象 -又到了喜闻乐见的初印象环节,这个环节决定了你心中的那 24 盏灯最终是全绿还是全灭。 +又到了喜闻乐见的初印象环节,这个环节决定了你心中的那 24 盏灯最终是全亮还是全灭。 -在本文中,我们将看看本专题的学习目标、`tokio`该怎么引入以及如何实现一个 `Hello Tokio` 项目,最终留灯还是灭灯的决定权留给各位看官。但我提前说好,如果你全灭了,但却找不到更好的,未来还是得回来真香 :P +在本文中,我们将看看本专题的学习目标、`tokio`该怎么引入以及如何实现一个 `Hello Tokio` 项目,最终亮灯还是灭灯的决定权留给各位看官。但我提前说好,如果你全灭了,但却找不到更好的,未来还是得回来真香 :P ## 专题目标 @@ -97,7 +97,7 @@ async fn main() -> Result<()> { ```shell $ cargo run -从服务器端获取到结果=Some(b"world") +从服务器端获取到结果=Some("world") ``` Perfect, 代码成功运行,是时候来解释下其中蕴藏的至高奥秘了。 @@ -209,7 +209,7 @@ fn main() { tokio = { version = "1", features = ["full"] } ``` -里面有个 `features = ["full"]` 可能大家会比较迷惑,当然,关于它的具体解释在本书的 [Cargo 详解专题](https://course.rs/cargo/intro.html) 有介绍,这里就简单进行说明, +里面有个 `features = ["full"]` 可能大家会比较迷惑,当然,关于它的具体解释在本书的 [Cargo 详解专题](https://course.rs/cargo/intro.html) 有介绍,这里就简单进行说明。 `Tokio` 有很多功能和特性,例如 `TCP`,`UDP`,`Unix sockets`,同步工具,多调度类型等等,不是每个应用都需要所有的这些特性。为了优化编译时间和最终生成可执行文件大小、内存占用大小,应用可以对这些特性进行可选引入。 @@ -217,7 +217,7 @@ tokio = { version = "1", features = ["full"] } ## 总结 -大家对 `tokio` 的初印象如何?可否 24 灯全绿通过? +大家对 `tokio` 的初印象如何?可否 24 灯全亮通过? 总之,`tokio` 做的事情其实是细雨润无声的,在大多数时候,我们并不能感觉到它的存在,但是它确实是异步编程中最重要的一环(或者之一),深入了解它对我们的未来之路会有莫大的帮助。 diff --git a/src/async-rust/tokio/overview.md b/src/async-rust/tokio/overview.md index 787220ee..76f194b6 100644 --- a/src/async-rust/tokio/overview.md +++ b/src/async-rust/tokio/overview.md @@ -72,14 +72,14 @@ Rust 语言的安全可靠性顺理成章的影响了 `tokio` 的可靠性,曾 虽然 `tokio` 对于大多数需要并发的项目都是非常适合的,但是确实有一些场景它并不适合使用: -- 并行运行 CPU 密集型的任务,`tokio` 非常适合于 IO 密集型任务,这些 IO 任务的绝大多数时间都用于阻塞等待 IO 的结果,而不是刷刷刷的单烤 CPU。如果你的应用是 CPU 密集型(例如并行计算),建议使用 [`rayon`](https://github.com/rayon-rs/rayon),当然,对于其中的 IO 任务部分,你依然可以混用 `tokio` +- 并行运行 CPU 密集型的任务,`tokio` 非常适合于 IO 密集型任务,这些 IO 任务的绝大多数时间都用于阻塞等待 IO 的结果,而不是刷刷刷的单靠 CPU。如果你的应用是 CPU 密集型(例如并行计算),建议使用 [`rayon`](https://github.com/rayon-rs/rayon),当然,对于其中的 IO 任务部分,你依然可以混用 `tokio` - 读取大量的文件, 读取文件的瓶颈主要在于操作系统,因为 OS 没有提供异步文件读取接口,大量的并发并不会提升文件读取的并行性能,反而可能会造成不可忽视的性能损耗,因此建议使用线程(或线程池)的方式 - 发送 HTTP 请求,`tokio` 的优势是给予你并发处理大量任务的能力,对于这种轻量级 HTTP 请求场景,`tokio` 除了增加你的代码复杂性,并无法带来什么额外的优势。因此,对于这种场景,你可以使用 [`reqwest`](https://github.com/seanmonstar/reqwest) 库,它会更加简单易用。 > 若大家使用 tokio,那 CPU 密集的任务尤其需要用线程的方式去处理,例如使用 `spawn_blocking` 创建一个阻塞的线程取完成相应 CPU 密集任务。 > -> 原因是:tokio 是协作式地调度器,如果某个 CPU 密集的异步任务是通过 tokio 创建的,那理论上来说,该异步任务需要跟其它的异步任务交错执行,最终大家都得到了执行,皆大欢喜。但实际情况是,CPU 密集的任务很可能会一直霸着着 CPU,此时 tokio 的调度方式决定了该任务会一直被执行,这意味着,其它的异步任务无法得到执行的机会,最终这些任务都会因为得不到资源而饿死。 +> 原因是:tokio 是协作式的调度器,如果某个 CPU 密集的异步任务是通过 tokio 创建的,那理论上来说,该异步任务需要跟其它的异步任务交错执行,最终大家都得到了执行,皆大欢喜。但实际情况是,CPU 密集的任务很可能会一直霸着着 CPU,此时 tokio 的调度方式决定了该任务会一直被执行,这意味着,其它的异步任务无法得到执行的机会,最终这些任务都会因为得不到资源而饿死。 > > 而使用 `spawn_blocking` 后,会创建一个单独的 OS 线程,该线程并不会被 tokio 所调度( 被 OS 所调度 ),因此它所执行的 CPU 密集任务也不会导致 tokio 调度的那些异步任务被饿死 From 3f319d4f47d39974ccd1a1959d27b88a0bed71b6 Mon Sep 17 00:00:00 2001 From: zongzi531 Date: Fri, 15 Apr 2022 13:28:58 +0800 Subject: [PATCH 2/2] fix: revert error change --- src/async-rust/tokio/overview.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/async-rust/tokio/overview.md b/src/async-rust/tokio/overview.md index 76f194b6..a069f908 100644 --- a/src/async-rust/tokio/overview.md +++ b/src/async-rust/tokio/overview.md @@ -72,7 +72,7 @@ Rust 语言的安全可靠性顺理成章的影响了 `tokio` 的可靠性,曾 虽然 `tokio` 对于大多数需要并发的项目都是非常适合的,但是确实有一些场景它并不适合使用: -- 并行运行 CPU 密集型的任务,`tokio` 非常适合于 IO 密集型任务,这些 IO 任务的绝大多数时间都用于阻塞等待 IO 的结果,而不是刷刷刷的单靠 CPU。如果你的应用是 CPU 密集型(例如并行计算),建议使用 [`rayon`](https://github.com/rayon-rs/rayon),当然,对于其中的 IO 任务部分,你依然可以混用 `tokio` +- 并行运行 CPU 密集型的任务,`tokio` 非常适合于 IO 密集型任务,这些 IO 任务的绝大多数时间都用于阻塞等待 IO 的结果,而不是刷刷刷的单烤 CPU。如果你的应用是 CPU 密集型(例如并行计算),建议使用 [`rayon`](https://github.com/rayon-rs/rayon),当然,对于其中的 IO 任务部分,你依然可以混用 `tokio` - 读取大量的文件, 读取文件的瓶颈主要在于操作系统,因为 OS 没有提供异步文件读取接口,大量的并发并不会提升文件读取的并行性能,反而可能会造成不可忽视的性能损耗,因此建议使用线程(或线程池)的方式 - 发送 HTTP 请求,`tokio` 的优势是给予你并发处理大量任务的能力,对于这种轻量级 HTTP 请求场景,`tokio` 除了增加你的代码复杂性,并无法带来什么额外的优势。因此,对于这种场景,你可以使用 [`reqwest`](https://github.com/seanmonstar/reqwest) 库,它会更加简单易用。