Python 3.4+Асинхронное программированиепонятие
asyncio.Task
задачи
Задача — корутина, запущенная в цикле событий конкурентно с остальными. Создаётся asyncio.create_task() и позволяет ждать результат, отменять и именовать работу.
Синтаксис
task = asyncio.create_task(coro, name=None); result = await task
Цикл держит на задачи только слабые ссылки: задача, которую никто не сохранил в переменную или множество, может быть собрана сборщиком мусора посреди работы. cancel() не останавливает задачу сразу, а бросает CancelledError в точке её текущего await; глотать это исключение в except Exception нельзя — с 3.8 оно наследует BaseException, но голый except его поймает. Напрямую asyncio.Task(...) не создают.
Примеры
import asyncio
async def work():
await asyncio.sleep(0.01)
return 'ok'
async def main():
task = asyncio.create_task(work(), name='worker')
print(task.get_name(), task.done()) # → worker False
print(await task, task.done()) # → ok True
asyncio.run(main())
import asyncio
async def forever():
try:
await asyncio.sleep(10)
except asyncio.CancelledError:
print('отменили во время sleep') # → отменили во время sleep
raise
async def main():
task = asyncio.create_task(forever())
await asyncio.sleep(0.01)
task.cancel()
try:
await task
except asyncio.CancelledError:
print(task.cancelled()) # → True
asyncio.run(main())
См. также
Открыть в полном глоссарииdocs.python.orgСообщить о неточности