Ищу объяснения преимуществ 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/

У меня есть ряд вопросов, на которые кто-нибудь не возражает:

  1. Единственное заметное преимущество асинхронных итераторов / менеджеров контекста, которое я уловил, - это то, что вы можете использовать awaitables в реализациях их требуемых магических методов. Я что-то упускаю или это так?

  2. В PEP 492, касающемся асинхронного диспетчера контекста, говорится: "Асинхронный диспетчер контекста - это диспетчер контекста, который может приостанавливать выполнение в своих методах входа и выхода". Это относится к вызову сопрограмм с использованием await?

1 ответ

Решение

Единственное заметное преимущество асинхронных итераторов / менеджеров контекста, которое я уловил, заключается в том, что вы можете использовать awaitables в реализациях необходимых им магических методов. Я что-то упускаю или это так?

Вы ничего не упускаете, кроме, возможно, важности способности приостанавливаться. Без приостанавливаемых магических методов контекстные менеджеры и итераторы были бы бесполезны для асинхронной работы. Например, обычный файловый объект служит итератором, который производит строки из файла. Чтобы объект async-файла (или поток) обеспечивал эквивалентную функциональность, он должен иметь возможность ожидать появления следующей строки и, таким образом, приостанавливать выполнение сопрограммы, которая выполняет итерацию по ней. То же самое применимо к диспетчеру контекста, вход которого должен устанавливать асинхронное сетевое соединение и так далее.

Относится ли [возможность приостановить выполнение] к вызову сопрограмм с использованием await?

С помощью await в async defэто один из способов приостановить исполнение. Другой вариант - для__aenter__ и т.д., чтобы быть обычными функциями, которые возвращают настраиваемый объект ожидания, реализующий собственный __await__. PEP 492 описывает функциональность с точки зрения кода, который использует диспетчер контекста, который должен быть готов к приостановке его магических методов -async with должен быть внутри async def и будет десахар кодировать, awaits в соответствующих местах.

Другие вопросы по тегам