I find the original post to be somewhat confusing and misleading, honestly. Not in a "trying to be controversial" way, at least necessarily, but in a "I'm not really sure where you're coming from" way.
My main takeaway is that the assumption is that the only reason to use async is that it's better performing that threads, while I find it's simply much easier to deal with complicated cases than in the (explicitly) threaded approach.
There's some lifetime handling that scoped threads help a lot with now, but mostly it's that in async you basically never need to be concerned about if some other resource needs to be serviced on the same thread to prevent a deadlock; in other words, if you don't see it, spawn() it! This means, of course, that you can quite easily get to 100k/s task spawns, so the claim in the post that most devs don't need to handle 100k tasks seems rather putting the thread before the task as it were; don't ask if you can not use 100k simultaneous tasks, ask how you could use them!
That said, the performance claims that were there were still either confusing or rather slanted. Saying 2GB of memory committed to doing nothing is fine because that's how much chrome uses (Press X to doubt that normal, <100 tab usage actually commits that much physical memory, but I'm sure everyone here will immediately correct me
) - then talking about bumping up your AWS instance size is pretty crazy. Like, I'm probably not running 100 tabs in chrome on my AWS server, why would I want to blow 2GB doing nothing on threads? Don't we want to be running 100k serverless functions/containers anyway? If I want to blow GBs of memory doing nothing I'd be using Node (oh wait, I am!
)
Other things like talking about OS schedulers being M:N were also pretty confused - I'm not sure what that whole section was trying to tell me. That it's hard to do manually but it works better if you can do it is exactly why async exists as a language feature; you don't need to think about how to deal with the difference between the backing thread and the task, other than ensuring that it's Send (which the post barely mentions)
To be fair: there are absolutely things that kind of suck about async in Rust. But when most of them go away when you box or spawn something, and the rest are either common to any async implementation in any language, or even problems it would be nice to have in any other language, I'm not really sure I buy that you should be all that scared of it.