Asynchronous programming (Python coroutines)
A coroutine is an asynchronous function. To execute it you must schedule it in an event loop. Scheduling is cooperative-based: coroutines must yield execution flow.
The OS is NOT involved with coroutines: Python handles their executions by itself.
A future is a placeholder in which a future result value will be stored later.
A task is an execution scheduling of a coroutine. It knows when a coroutine is done: if it returned a value, a result, or an exception.
An awaitable is anything that can be awaited with await: coroutine, task, future
An async program is built as a concurrent one but it is a single-threaded process.