Skip to content

Minor fix-ups to the async section. #566

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Apr 16, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 4 additions & 2 deletions src/async/control-flow/select.md
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,9 @@ async fn main() {
* Try adding a deadline to the race, demonstrating selecting different sorts of
futures.

* Note that `select!` consumes the futures it is given, and is easiest to use
when every execution of `select!` creates new futures.
* Note that `select!` moves the values it is given. It is easiest to use
when every execution of `select!` creates new futures. An alternative is to
pass `&mut future` instead of the future itself, but this can lead to
issues, further discussed in the pinning slide.

</details>
13 changes: 7 additions & 6 deletions src/async/pitfalls/async-traits.md
Original file line number Diff line number Diff line change
Expand Up @@ -48,13 +48,14 @@ async fn main() {

<details>

* The difficulty with `async trait` is in that the resulting `Future` does not
have a size known at compile time, because the size of the `Future` depends
on the implementation.

* `async_trait` is easy to use, but note that it's using heap allocations to
achieve this, and solve the unknow size problem above. This heap allocation
has performance overhead.
achieve this. This heap allocation has performance overhead.

* The challenges in language support for `async trait` are deep Rust and
probably not worth describing in-depth. Niko Matsakis did a good job of
explaining them in [this
post](https://smallcultfollowing.com/babysteps/blog/2019/10/26/async-fn-in-traits-are-hard/)
if you are interested in digging deeper.

* Try creating a new sleeper struct that will sleep for a random amount of time
and adding it to the Vec.
Expand Down
4 changes: 3 additions & 1 deletion src/async/pitfalls/pin.md
Original file line number Diff line number Diff line change
Expand Up @@ -103,8 +103,10 @@ async fn main() {
iteration (a fused future would help with this). Update to reset
`timeout_fut` every time it expires.

* Box allocates on the heap. In some cases, `tokio::pin!` is also an option, but
* Box allocates on the heap. In some cases, `std::pin::pin!` (only recently
stabilized, with older code often using `tokio::pin!`) is also an option, but
that is difficult to use for a future that is reassigned.

* Another alternative is to not use `pin` at all but spawn another task that will send to a `oneshot` channel every 100ms.

</details>
4 changes: 2 additions & 2 deletions src/async/tasks.md
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
# Tasks

Runtimes have the concept of a "Task", similar to a thread but much
Runtimes have the concept of a "task", similar to a thread but much
less resource-intensive.

A Task has a single top-level Future which the executor polls to make progress.
A task has a single top-level future which the executor polls to make progress.
That future may have one or more nested futures that its `poll` method polls,
corresponding loosely to a call stack. Concurrency within a task is possible by
polling multiple child futures, such as racing a timer and an I/O operation.
Expand Down
3 changes: 0 additions & 3 deletions src/exercises/day-4/async.md

This file was deleted.