Ищу объяснения преимуществ async with/for
Я новичок в asyncio. Недавно я наткнулся на AIOFiles (https://github.com/Tinche/aiofiles) и увидел в документации, что он поддерживает "async with" и "async for". Я хотел узнать об этом, но об этом не так много хорошего, кроме PEP 492, в котором не слишком много деталей.
Ярлыки к соответствующим разделам PEP 492:
https://www.python.org/dev/peps/pep-0492/
https://www.python.org/dev/peps/pep-0492/
У меня есть ряд вопросов, на которые кто-нибудь не возражает:
Единственное заметное преимущество асинхронных итераторов / менеджеров контекста, которое я уловил, - это то, что вы можете использовать awaitables в реализациях их требуемых магических методов. Я что-то упускаю или это так?
В PEP 492, касающемся асинхронного диспетчера контекста, говорится: "Асинхронный диспетчер контекста - это диспетчер контекста, который может приостанавливать выполнение в своих методах входа и выхода". Это относится к вызову сопрограмм с использованием await?
1 ответ
Единственное заметное преимущество асинхронных итераторов / менеджеров контекста, которое я уловил, заключается в том, что вы можете использовать awaitables в реализациях необходимых им магических методов. Я что-то упускаю или это так?
Вы ничего не упускаете, кроме, возможно, важности способности приостанавливаться. Без приостанавливаемых магических методов контекстные менеджеры и итераторы были бы бесполезны для асинхронной работы. Например, обычный файловый объект служит итератором, который производит строки из файла. Чтобы объект async-файла (или поток) обеспечивал эквивалентную функциональность, он должен иметь возможность ожидать появления следующей строки и, таким образом, приостанавливать выполнение сопрограммы, которая выполняет итерацию по ней. То же самое применимо к диспетчеру контекста, вход которого должен устанавливать асинхронное сетевое соединение и так далее.
Относится ли [возможность приостановить выполнение] к вызову сопрограмм с использованием await?
С помощью await
в async def
это один из способов приостановить исполнение. Другой вариант - для__aenter__
и т.д., чтобы быть обычными функциями, которые возвращают настраиваемый объект ожидания, реализующий собственный __await__
. PEP 492 описывает функциональность с точки зрения кода, который использует диспетчер контекста, который должен быть готов к приостановке его магических методов -async with
должен быть внутри async def
и будет десахар кодировать, await
s в соответствующих местах.