I am new to asynchronous programming.
My understanding is that it is useful for tasks that run in parallel but have a lot of waiting involved. For example, downloading 10 zip archives and decompressing them can be done in parallel but since the "downloading" part is just waiting time for the CPU, asyncio is a useful concept here. Please correct me if I'm wrong.
All tutorials I have seen follow a similar examplary problem as described above and solve it by creating a bunch of awaitables and then await all of them together. (e.g. by gather)
However, it seems a common requirement to me to start such an async operation, e.g. the download of a file, continue to do other work in parallel until the file is actually needed and then retrieve it. This is basically what "futures" represent.
I don't see how this could be implemented with async functions though. If I wouldn't "await" the call to download_file, then it would not even perform the initial setup and the download would not be started. If I would "await" the call immediately, it would wait for the entire download to finish and I wouldn't be able to do any work in parallel.
The only solution I came up with is to have download_file return an awaitable future. Is that truly the best way? If so, what even is the point of async, if we still have to use objects like futures like we had to before "async" keywords were introduced?