Ищу объяснение преимуществ асинхронности с / для - PullRequest
0 голосов
/ 06 ноября 2019

Я новичок в asyncio. Я недавно натолкнулся на AIOFiles (https://github.com/Tinche/aiofiles)) и увидел в документации, что он поддерживает «async with» и «async for». Я хотел бы узнать об этом, но о PEP 492, который не очень хорошо освещен, -не вдаваться в подробности.

Ярлыки на соответствующие разделы ПКП 492:

https://www.python.org/dev/peps/pep-0492/#asynchronous-context-managers-and-async-with

https://www.python.org/dev/peps/pep-0492/#asynchronous-iterators-and-async-for

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

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

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

1 Ответ

1 голос
/ 06 ноября 2019

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

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

Имеет ли [возможность приостановить выполнение] обращение к вызывающим сопрограммам с использованием await?

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...