If you use threads, green or otherwise, you don't have to "implement" special code for composing things together, you get the full set of tools for composing code together, which includes, in passing, state machines, among all the other things it includes. This basically implements an Inner Platform Effect of an internal data-based language for concurrency that the language interprets, which will A: forever be weaker than the exterior language (such is the nature of the Inner Platform Effect) and B: require a lot of work that is essentially duplicating program control flow and all sorts of other things the exterior language already has.<p>There are some programming languages that have sufficiently impoverished semantics that this is their best effort that they can make towards concurrency.<p>But this is <i>Rust</i>. It's the language that fixes all the reasons to be afraid of threading in the first place. What's actually <i>wrong</i> with threads here? This isn't Java. And having written network servers with pretty much every abstraction so much as mentioned in the article, green threads are a <i>dream</i> for writing network servers. You can hardly believe how much accidental complexity you're fighting with every day in non-threaded solutions until you try something like Erlang or Go. Rust could be something that I mention in the same breath for network servers. But not with this approach.<p>There's plenty to debate in this post and I don't expect to go unchallenged. But I would remind repliers that we are <i>explicitly</i> in a Rust context. We must talk about <i>Rust</i> here, not 1998-C++. What's so wrong with <i>Rust</i> threads, excepting perhaps them being heavyweight? (Far better to solve that problem directly.)
It would be much nicer to use coroutines instead of state machines. This means that you could write code as if it were doing i/o in a "blocking" fashion, but behind the scenes it is actually asynchronous.
I think a lot of folks think of Network IO when they say Asynchronous IO. That's only half the story, unless you're just building proxies and caches you have to deal with Disk IO at some point in time. And, async disk IO is horrible in every OS / language.