The errata list is a list of errors and their corrections that were found after the product was released.
The following errata were submitted by our customers and have not yet been approved or disproved by the author or editor. They solely represent the opinion of the customer.
Color Key: Serious technical mistake Minor technical mistake Language or formatting error Typo Question Note Update
| Version | Location | Description | Submitted by | Date submitted |
|---|---|---|---|---|
| O'Reilly learning platform | Page Chapter 1 "What is Async" 2nd paragraph after main example |
"runs until it is interrupted or it is yielded by the CPU voluntarily" |
Anonymous | Dec 16, 2023 |
| O'Reilly learning platform | Page Chapter 1 "What is Async" paragraph after figure 1-1 |
"If we were to use Tokio to join four Fibonacci computations we would not get an increase in speed as we are only using one thread." |
Anonymous | Dec 16, 2023 |
| O'Reilly learning platform | Page Chapter 1 "Introduction to Processes" first paragraph |
"A process is a program or application that is executed by the CPU." |
Anonymous | Dec 16, 2023 |
| O'Reilly learning platform | Page ch2 Pinning in Futures |
in the example 'SelfReferential'. |
Bruce | May 11, 2024 |
| Page p.36 1st paragraph |
text says: |
HIDEMOTO NAKADA | Feb 23, 2025 | |
| Page p.43 in the middle |
If the future is not pending (i.e., not ready), the executor places the task back into the queue to be executed in the future. |
HIDEMOTO NAKADA | Feb 23, 2025 | |
| Printed | Page p.27 1st code block |
async fn prep_coffee_mug() { |
HIDEMOTO NAKADA | Feb 24, 2025 |
| Printed | Page p.27 1st code block |
async fn prep_coffee_mug() { |
HIDEMOTO NAKADA | Feb 24, 2025 |
| Printed | Page p.67 second code block |
std::env::set_var("LOW_NUM", self.low_num.to_string()); |
HIDEMOTO NAKADA | Feb 26, 2025 |
| Printed | Page p.9 in the middle |
'Once we start using all our cores, the extra spawned processes will start to get blocked.' |
HIDEMOTO NAKADA | Mar 29, 2025 |
| Page p.14 in the middle |
The `shared_data_clone` thread is passed to `background_thread`, |
HIDEMOTO NAKADA | Mar 29, 2025 | |
| Page p.15 the last paragraph |
Adding multiple `Condvars` for `updater_thread` to cycle ... |
HIDEMOTO NAKADA | Mar 29, 2025 | |
| Page p.30 l.2 |
If the count is at three |
HIDEMOTO NAKADA | Mar 29, 2025 | |
| Page p.9 second paragraph |
There can be limits to the number of threads we can spawn in an OS, |
HIDEMOTO NAKADA | Mar 29, 2025 | |
| Page p.18 code in the middle |
|
HIDEMOTO NAKADA | Mar 29, 2025 | |
| Page p.21 the output in the last line |
|
HIDEMOTO NAKADA | Mar 29, 2025 | |
| Page p.80 the paragraphs on the poll_write and the poll_flush |
I believe there are several problems in these paragraphs. |
HIDEMOTO NAKADA | Mar 29, 2025 | |
| Page p.128 the first paragraph of 'Building our event bus struct' |
'Consumers also need to be able to unsubscribe to events.' |
HIDEMOTO NAKADA | Mar 30, 2025 | |
| Page p.143 in the paragraph after 'thread_local' j |
'We then need a simple async task that blocks the thread for a second, ' |
HIDEMOTO NAKADA | Mar 30, 2025 | |
| Page p.143 l.4 |
'This means we can use structs that do not have the Send trait implemented because we are ensuring that the task stays on a specific thread.’ |
HIDEMOTO NAKADA | Mar 30, 2025 | |
| Page p.156 the last code fragment |
if msg.responder.send(state).is_err() { |
HIDEMOTO NAKADA | Mar 30, 2025 | |
| Page p.168 the first paragraph |
We need both actors to load the state on startup, so our file loading is defined by the following isolated function: |
HIDEMOTO NAKADA | Mar 30, 2025 | |
| Page p.170 The end of the first paragraph of 'Creating Actor Supervisor' |
The supervisor can also send reset requests to the correct actor |
HIDEMOTO NAKADA | Mar 30, 2025 | |
| Page p.187 the implementation of ExcitedGreeting. |
the code does not implement the Greeting trait. |
HIDEMOTO NAKADA | Mar 30, 2025 | |
| Page p.192 the first paragraph |
However, we could replace this switch with a counter by using an AtomicUsize, as opposed to an AtomicBool, if we wanted. |
HIDEMOTO NAKADA | Mar 30, 2025 | |
| Page p.220 in the 4th paragraph |
"We can now move on to our async function where we spawn a task," |
HIDEMOTO NAKADA | Mar 30, 2025 | |
| Page p.223 the 4th paragraph |
The logic of how we handle the result stays the same: we spawn the task before the print statement and get the result after the print statement. |
HIDEMOTO NAKADA | Mar 30, 2025 | |
| Page p.223 the 'use' code block |
use super::*; |
HIDEMOTO NAKADA | Mar 30, 2025 | |
| Page p.228 the first paragraph |
"In our test function, we can build a single-threaded runtime and spawn 10,000 unsafe_add tasks." |
HIDEMOTO NAKADA | Mar 30, 2025 | |
| Page p.234 the last paragraph |
"Here we can see with our assert_pending trait, " |
HIDEMOTO NAKADA | Mar 30, 2025 | |
| Printed | Page ch7 p148 "Getting Unsafe with Thread Data" let repeated_sequence: Vec<_> = [...].take(5000).[...]; |
5000 should be 500_000 to match the following text "This gives us half a million async tasks" and to match the expected output of 200_000. |
David Wallace Croft | Jun 13, 2025 |
| Printed | Page 18 watch_file_changes() method code block |
tx is Sender<bool> but used as tx.send(()). Correct by changing tx to Sender<()> and change on the following page watch::channel(false) to watch::channel(()) |
David Wallace Croft | May 04, 2025 |
| Printed | Page 37 line 7 |
Basic spelling mistake. Line 7 says "...trigger task recieves the message". Should be "receives". |
Avram Aelony | May 12, 2025 |
| Page 37 source code |
let outome = task_handle.await.unwrap(); |
Gioh Kim | May 13, 2025 | |
| Printed | Page 193 and 194, Chapter 9 "The Retry Pattern" function do_something() code |
Return type of function do_something() was probably meant to be "Result<(String), [...]>" instead of "Result<(), [...]>". The final line of the function should probably be "Ok(result)" instead of "Ok(())". Variable "miliseconds" should be spelled as "milliseconds". |
David Wallace Croft | Jun 29, 2025 |
| Printed | Page 235 of Ch. 11, Sec. "Fine-Grained Future Testing" 2nd code block |
If you remark out the "drop(future1);" line, the unit test still passes. This suggests that the theory behind this example might be wrong. If you remark out the preceding or following lines, the unit test will fail which suggest there is something specific about the order of polling and sleeping that releases the lock instead of the drop. I was able to observe being able to remark out the drop line and still have the unit test pass in both my adaption of the code and using a clone of the author's example code on GitHub. |
David Wallace Croft | Jul 14, 2025 |