Olivia ๐Ÿฆ€'s Avatar

Olivia ๐Ÿฆ€

@iolivia.me

๐Ÿ‘ฉโ€๐Ÿ’ป staff eng ๐Ÿฆ€ post a lot about rust and rust gamedev โœ๏ธ wrote https://sokoban.iolivia.me ๐Ÿ”ฅ blog at https://iolivia.me ๐Ÿงต weekly #rustlang threads every Thursday - subscribe here https://forms.gle/Tcm7cAkLt4NF9ZCZ9

706
Followers
76
Following
996
Posts
06.04.2024
Joined
Posts Following

Latest posts by Olivia ๐Ÿฆ€ @iolivia.me

In addition to this, I have another rust project that I'm very excited about working on, and doing both at the same time plus other personal and work commitments is pretty hard.

So, to wrap it up, thank you everyone who read and enjoyed the threads, you are the best!

04.12.2025 19:32 ๐Ÿ‘ 11 ๐Ÿ” 0 ๐Ÿ’ฌ 2 ๐Ÿ“Œ 0

While reddit has a very large engaged audience, they are also very particular about content, so every other comment I get (for the free content I spend ages to write) is "arghh this format sucks".

Which makes the newsletter very difficult to grow, since my goal is to share this with as many people

04.12.2025 19:30 ๐Ÿ‘ 4 ๐Ÿ” 0 ๐Ÿ’ฌ 1 ๐Ÿ“Œ 0

They take ages to write, even for topics that I am already familiar with, and if I'm not I have to spend extra time learning the topic before I can write about it.

Growing the newsletter is a whole different game, the bluesky community and traffic is pretty small, so it requires posting to reddit.

04.12.2025 19:28 ๐Ÿ‘ 3 ๐Ÿ” 0 ๐Ÿ’ฌ 1 ๐Ÿ“Œ 0

One year in, time to reflect on the #rustlang threads!

I wrote 44 total threads, many of you read them, and liked them and almost 100 people subscribed to the newsletter!

I couldn't be more thankful for this.

But unfortunately, I will stop writing these for now.

Why? ๐Ÿ‘‡

04.12.2025 19:26 ๐Ÿ‘ 15 ๐Ÿ” 0 ๐Ÿ’ฌ 3 ๐Ÿ“Œ 0

๐Ÿ“ค #rustlang newsletter email just sent out!

14.11.2025 08:08 ๐Ÿ‘ 5 ๐Ÿ” 0 ๐Ÿ’ฌ 0 ๐Ÿ“Œ 0
Preview
Rust Threads Newsletter Get bite-size Rust Threads about fundamental concepts and practical usage right in your inbox every Thursday. Checkout this for a sample of previous threads:โ€ฆ

That's it, we learned the basics of how async programming works in Rust!

Hope it helped you learn 1% more Rust today, follow me for more threads like this and subscribe to receive these threads over email forms.gle/vY6zXE21Dkwa... ๐Ÿฆ‹ ๐Ÿฆ€

13.11.2025 08:05 ๐Ÿ‘ 2 ๐Ÿ” 0 ๐Ÿ’ฌ 0 ๐Ÿ“Œ 0

6๏ธโƒฃ Conclusion
- Futures are lazy state machines
- Async provides concurrency, not necessarily parallelism
- Cooperative multitasking: tasks yield at .await points only
- Send = safe to move between threads
- Sync = safe to share references btwn threads
- Use async for I/O-bound, threads for CPU-bound

13.11.2025 08:05 ๐Ÿ‘ 4 ๐Ÿ” 0 ๐Ÿ’ฌ 1 ๐Ÿ“Œ 0
Post image

5๏ธโƒฃ When to Use Async vs Threads

Async is perfect for I/O-bound operations where you're waiting for external resources, use async for concurrency with I/O. Use threads for CPU parallelism!

13.11.2025 08:05 ๐Ÿ‘ 1 ๐Ÿ” 0 ๐Ÿ’ฌ 1 ๐Ÿ“Œ 0

The runtime uses cooperative multitasking - it only switches between tasks at .await points. If a task never yields, it can block everything!

13.11.2025 08:05 ๐Ÿ‘ 1 ๐Ÿ” 0 ๐Ÿ’ฌ 1 ๐Ÿ“Œ 0
Post image

4๏ธโƒฃ The Runtime

Async code needs a runtime to execute. The runtime manages the state machines, decides when to poll futures, and handles task scheduling. A main function in itself can be sync, with a runtime inside, or you could use #[tokio::main] to achieve the same with less boilerplate.

13.11.2025 08:05 ๐Ÿ‘ 1 ๐Ÿ” 0 ๐Ÿ’ฌ 1 ๐Ÿ“Œ 0
Post image

implementations for Send and Sync, and if they don't it's because most of the time they are not safe to send across threads. In practice I think you'll find most of the time in basic cases it will just work out of the box.

13.11.2025 08:05 ๐Ÿ‘ 1 ๐Ÿ” 0 ๐Ÿ’ฌ 1 ๐Ÿ“Œ 0

3๏ธโƒฃ Sync Trait

Sync trait is automatically implemented for types for which it is safe to share references between threads. A type cannot be Sync unless it is Send, which of course makes sense as you wouldn't be able to share a reference to an "unsafe" object.

Most types get automatic ...

13.11.2025 08:05 ๐Ÿ‘ 1 ๐Ÿ” 0 ๐Ÿ’ฌ 1 ๐Ÿ“Œ 0

This is why Send trait is important because it prevents at compile time thread safety issues!

13.11.2025 08:05 ๐Ÿ‘ 1 ๐Ÿ” 0 ๐Ÿ’ฌ 1 ๐Ÿ“Œ 0
Post image

But what if we used `Rc<String>` instead of String like this?

This won't work because Rc doesn't implement Send, which means BadTranscript doesn't implement Send, which means we actually can't move this value between threads and use it as an output of the async task.

13.11.2025 08:05 ๐Ÿ‘ 0 ๐Ÿ” 0 ๐Ÿ’ฌ 1 ๐Ÿ“Œ 0
Post image

2๏ธโƒฃ Send Trait

What if we wanted to return a transcript object like this?

This works!

13.11.2025 08:05 ๐Ÿ‘ 1 ๐Ÿ” 0 ๐Ÿ’ฌ 1 ๐Ÿ“Œ 0
Post image

You can check out the Future trait, or more importantly the Poll enum which shows you exactly how this works under the hood. Basically each Poll is either Ready which means the future has finished running and we have the output T, or it's Pending which means it's still executing.

13.11.2025 08:05 ๐Ÿ‘ 1 ๐Ÿ” 0 ๐Ÿ’ฌ 1 ๐Ÿ“Œ 0
Post image

1๏ธโƒฃ Futures

When you write async fn, Rust creates a Future - a value that may not be ready now but will be later. Futures are lazy and do nothing until you await them.

Behind the scenes, Rust compiles your async function into a state machine that can be paused at each await and resumed later.

13.11.2025 08:05 ๐Ÿ‘ 2 ๐Ÿ” 0 ๐Ÿ’ฌ 1 ๐Ÿ“Œ 0
Post image

3 seconds are real work, some of it is waiting for a network or IO call to come back.

This is a perfect example to use async to handle all transcript requests concurrently and optimise resources. While we wait for that, we can do other work from another task.

13.11.2025 08:05 ๐Ÿ‘ 2 ๐Ÿ” 0 ๐Ÿ’ฌ 1 ๐Ÿ“Œ 0

We can expect the transcript generation under the hood does multiple steps like:
* call an API over the network to get the student's data
* do some CPU intensive work to calculate averages and totals based on that data
* generate a PDF in memory
* save PDF file

This means not all those ..

13.11.2025 08:05 ๐Ÿ‘ 1 ๐Ÿ” 0 ๐Ÿ’ฌ 1 ๐Ÿ“Œ 0
Post image

0๏ธโƒฃ Blocking vs Async Code

Let's see what happens when 3 students request transcripts using traditional blocking code. Not only is everything sequential, so each student needs to wait for all transcripts to finish before getting theirs, but also if we are on the main thread we'd be freezing the UI

13.11.2025 08:05 ๐Ÿ‘ 1 ๐Ÿ” 0 ๐Ÿ’ฌ 1 ๐Ÿ“Œ 0
Post image

๐Ÿ•ฐ๏ธ Async Basics in #rustlang

Send, Sync, Future, tokio, Pin, I'm sure you've heard a lot of intimidating terminology when it comes to async Rust, so this thread is about explaining the basics in a simple way.

We'll build a transcript generator to understand async/await, Futures

๐Ÿงต๐Ÿ‘‡

13.11.2025 08:05 ๐Ÿ‘ 15 ๐Ÿ” 0 ๐Ÿ’ฌ 1 ๐Ÿ“Œ 0

No #rustlang threads today but Iโ€™ll be back next week!

If you have a topic you'd like me to cover please suggest it in the replies ๐Ÿ˜€

06.11.2025 07:08 ๐Ÿ‘ 8 ๐Ÿ” 0 ๐Ÿ’ฌ 2 ๐Ÿ“Œ 0
Preview
Rust Threads Newsletter Get bite-size Rust Threads about fundamental concepts and practical usage right in your inbox every Thursday. Checkout this for a sample of previous threads:โ€ฆ

That's it, we looked at how to do basic error handling in rust and then improved it using anyhow for context and thiserror w error types.

Hope it helped you learn 1% more Rust today, follow me for more threads like this and subscribe to receive these threads over email forms.gle/vY6zXE21Dkwa... ๐Ÿฆ‹ ๐Ÿฆ€

30.10.2025 08:05 ๐Ÿ‘ 1 ๐Ÿ” 0 ๐Ÿ’ฌ 0 ๐Ÿ“Œ 0

๐Ÿ’ก This is the key difference: anyhow is great for applications where you just need good error messages, while thiserror is perfect for libraries where consumers need to handle errors programmatically.

30.10.2025 08:05 ๐Ÿ‘ 4 ๐Ÿ” 0 ๐Ÿ’ฌ 1 ๐Ÿ“Œ 0
Post image

The error messages are now cleaner and more structured. With custom error types, library clients can:
- Match on specific error variants to handle different cases
- Access error fields programmatically (like student_id, course_id)
- Make informed decisions based on the error type

30.10.2025 08:05 ๐Ÿ‘ 1 ๐Ÿ” 0 ๐Ÿ’ฌ 1 ๐Ÿ“Œ 0
Post image

Then, we change all instances of anyhow! to return the appropriate EnrollmentError variant, and change the function signatures to return Result<T, EnrollmentError>. Note that we can no longer use `.context()` since that's an anyhow feature, but the errors themselves need to be descriptive enough

30.10.2025 08:05 ๐Ÿ‘ 1 ๐Ÿ” 0 ๐Ÿ’ฌ 1 ๐Ÿ“Œ 0
Post image

and we wanted to expose more specific error types that clients can match on and handle differently, we need custom error types. We can use the thiserror::Error derive macro to easily create a custom error enum with different variants for each error case.

30.10.2025 08:05 ๐Ÿ‘ 1 ๐Ÿ” 0 ๐Ÿ’ฌ 1 ๐Ÿ“Œ 0

3๏ธโƒฃ Custom error types

The course enrollment is a pretty representative complex example, and the solution with anyhow context is normally good enough for internal application code where you don't need to worry about exposing error types to external clients

However, if this was a library ...

30.10.2025 08:05 ๐Ÿ‘ 1 ๐Ÿ” 0 ๐Ÿ’ฌ 1 ๐Ÿ“Œ 0
Post image Post image

We could extend this to a more complex example like course enrollment with a deeper chain. Here's how the process_enrollment function uses context at multiple levels.

Notice how each layer of context provides additional info about where in the call stack the error occurred.

30.10.2025 08:05 ๐Ÿ‘ 1 ๐Ÿ” 0 ๐Ÿ’ฌ 1 ๐Ÿ“Œ 0
Post image

You can see in the last error the top level error message is "Failed to add student with id 2" and the cause is "Name cannot be empty". This additional context is super helpful for complex chains of function calls.

30.10.2025 08:05 ๐Ÿ‘ 1 ๐Ÿ” 0 ๐Ÿ’ฌ 1 ๐Ÿ“Œ 0