Future из модуля asyncio (это не то же самое, что concurrent.futures.Future:
future = asyncio.Future()
Cоздаем новую задачу, которая будет выполняться асинхронно
asyncio.create_task(set_after_delay(future))
Она:
- Принимает future как параметр
- Ждет 1 секунду
- Устанавливает результат в future
Ждем, пока future получит результат. Это не блокирует весь интерпретатор, а только текущую корутину:
result = await future
Это еще называют «Неблокирующим ожиданием».