You've already forked comprehensive-rust
mirror of
https://github.com/google/comprehensive-rust.git
synced 2025-07-01 12:44:55 +02:00
Minor fix-ups to the async section. (#566)
These address some comments in #496.
This commit is contained in:
committed by
GitHub
parent
87f1976589
commit
d143528e07
@ -69,7 +69,9 @@ async fn main() {
|
|||||||
* Try adding a deadline to the race, demonstrating selecting different sorts of
|
* Try adding a deadline to the race, demonstrating selecting different sorts of
|
||||||
futures.
|
futures.
|
||||||
|
|
||||||
* Note that `select!` consumes the futures it is given, and is easiest to use
|
* Note that `select!` moves the values it is given. It is easiest to use
|
||||||
when every execution of `select!` creates new futures.
|
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>
|
</details>
|
||||||
|
@ -48,13 +48,14 @@ async fn main() {
|
|||||||
|
|
||||||
<details>
|
<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
|
* `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
|
achieve this. This heap allocation has performance overhead.
|
||||||
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
|
* Try creating a new sleeper struct that will sleep for a random amount of time
|
||||||
and adding it to the Vec.
|
and adding it to the Vec.
|
||||||
|
@ -103,8 +103,10 @@ async fn main() {
|
|||||||
iteration (a fused future would help with this). Update to reset
|
iteration (a fused future would help with this). Update to reset
|
||||||
`timeout_fut` every time it expires.
|
`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.
|
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.
|
* Another alternative is to not use `pin` at all but spawn another task that will send to a `oneshot` channel every 100ms.
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
|
@ -1,9 +1,9 @@
|
|||||||
# Tasks
|
# 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.
|
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,
|
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
|
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.
|
polling multiple child futures, such as racing a timer and an I/O operation.
|
||||||
|
@ -1,3 +0,0 @@
|
|||||||
# Exercises
|
|
||||||
|
|
||||||
TBD
|
|
Reference in New Issue
Block a user