Why is async code in Rust considered especially hard compared to Go or just threads?
I've read recently that using async Rust is much harder than Go (gorountines) or just threads. I wonder why?
As an example, let's say we need to run some cpu heavy operation (let's say 3 seconds blocking a thread) within a web service.
Async Rust with Tokio just blocking the task
Async Rust with Tokio using spawn_blocking
Go just blocking the goroutine
Go scheduling the cpu heavy work on a new goroutine
I don't see why blocking in Rust (1.) is more harmful than blocking in Go (3.).
And why spawning a new thread in Rust (2.) is more difficult or more dangerous (if at all) than spawning a new goroutine (4.)?