Asynchronous programming comes with certain complexities, and it's easy to make mistakes when using async in Rust.
Accidentally performing synchronous blocking operations in asynchronous code is a major pitfall. It undermines the advantages of async programming and causes performance bottlenecks.
Forgetting to use .await will result in the Future not being executed at all.
Excessively spawning lightweight tasks introduces overhead from task scheduling and context switching, which can actually reduce performance.