Python 3.4+Асинхронное программированиепонятие
asyncio.Future
задачи
Низкоуровневый объект «результат появится позже»: его можно ждать через await, а значение кладут set_result() или set_exception(). На нём построена asyncio.Task.
Синтаксис
fut = loop.create_future(); fut.set_result(value); value = await fut
Это не concurrent.futures.Future: тот живёт в потоках и его не ждут через await, а asyncio.Future не потокобезопасен и привязан к циклу. Результат кладётся ровно один раз — второй set_result() или result() у незавершённого future дают InvalidStateError. Создавать его лучше loop.create_future(), а в прикладном коде он почти не нужен: для работы в фоне есть create_task(), для сигнала между задачами — asyncio.Event.
Примеры
import asyncio
async def main():
loop = asyncio.get_running_loop()
fut = loop.create_future()
loop.call_later(0.01, fut.set_result, 42) # кто-то положит результат позже
print(await fut) # → 42
try:
fut.set_result(43)
except asyncio.InvalidStateError:
print('результат уже есть') # → результат уже есть
asyncio.run(main())
См. также
Открыть в полном глоссарииdocs.python.orgСообщить о неточности