I’m just starting to learn Rust, and was wondering if there is a good way to do coroutines/channels. I’ve grown fond of languages based around CSP, but am not sure that maps well to idiomatic Rust.
Thanks in advance!
One approach I’m personally fond of is actor-style async programming with tokio. It’s easy to mingle timers with receiving messages from channels, which is quite powerful. This post by Alice Rhyl is a good description of the idea: https://ryhl.io/blog/actors-with-tokio/
This.
tokio tasks are green threads. https://docs.rs/tokio/latest/tokio/task/
tokio also offers a variety of channels for synchronization between tasks. https://docs.rs/tokio/latest/tokio/sync/index.html
Wait is there a difference between coroutines and async/await? I thought they were practically the same model.
Coroutines are one means of implementing async; the way they are implemented in Rust is more like building a state machine out of the async function. It can still be mapped to coroutines, and there are probably crates that use async and macros to make coroutines usable on stable, but the effort to have a stable language feature is still ongoing, with https://lang-team.rust-lang.org/design_notes/general_coroutines.html giving the overview.
Someone please correct me because I’m fairly sure I’m not entirely correct here, but IIRC from the ‘Programming Lua’ book, (symmetric) coroutines allow you to pass data back into the routine at the
await
point. Or, in Lua parlance,coroutine.resume()
can take arguments.
You can use mpsc for channels, there’s oneshots too
Super interested to see if this is true as well. AFAIK Rust focuses on threading and async/await with Tokio being the main focus.
I believe there is some support of green threads with Tokio configuration but I’m not 100% sure and am just writing off the top of my head because nobody has responded yet.