Что такое future в Python
Что проверяют
Понимаете ли вы разницу между результатом и обещанием результата и не путаете ли два разных класса с одним именем. В Python есть concurrent.futures.Future для пулов потоков и процессов и asyncio.Future для событийного цикла, и вопрос обычно про то, знаете ли вы, какой из них у вас в руках.
Как отвечать
Future это объект-держатель будущего значения. Он создаётся в момент постановки задачи и проходит состояния: ожидает, выполняется, завершён или отменён. Результат забирается методом, который заодно перебрасывает исключение, если задача упала.
Версия из concurrent.futures возвращается из submit у пула. Её result() блокирует вызывающий поток и принимает таймаут, готовые задачи удобно разбирать через as_completed, а сам пул раздаёт потоки или процессы.
Версия из asyncio живёт в событийном цикле, её ждут через await, и она не потокобезопасна. Task это её наследник, обёрнутый вокруг корутины. Мосты между мирами стоит назвать отдельно: loop.run_in_executor отдаёт объект для await, asyncio.wrap_future переводит пуловый future в цикловой, а asyncio.run_coroutine_threadsafe наоборот возвращает пуловый.
Практический смысл в том, что future отделяет запуск от получения результата: можно запустить десяток задач, заняться своими делами и забрать значения тогда, когда они действительно понадобились.
Где спотыкаются
Зовут блокирующий result() внутри корутины. Событийный цикл встаёт целиком, и асинхронный сервис превращается в однозадачный, хотя внешне код выглядит правильно. В корутине ждут через await, а блокирующую работу отдают в исполнитель.
Не забирают результат вообще. submit не бросает исключение, оно лежит внутри объекта и всплывает только при обращении, поэтому упавшая задача выглядит как успешно выполненная. В асинхронной ветке то же самое видно по предупреждению о непрочитанном исключении задачи.
Думают, что отмена останавливает работу. Отменить получится только то, что ещё не начали: запущенная функция в пуле досчитает до конца, а выход из контекстного менеджера пула дождётся её завершения. Прерывание по-настоящему делают флагом или таймаутом внутри самой задачи.