stackoverflow.com/questions/46830144/...

hon асинхронные функции генератора являются сопрограммами, а функции генератора также являются сопрограммами.

Каковы различия между назначением функций генератора и асинхронных функций генератора?

Благодарю.

 Jim Fasarakis Hilliard14 сент. 2017 г., 14:52
CV-избиратель, если бы вопрос был слишком широким, ответ на его длину был бы невозможен. Не голосуйте без разбора.

Ответы на вопрос(1)

Решение Вопроса

PEP 525 - асинхронные генераторы очень похоже наPEP 255 - Простые генераторы который представил генераторы. В основном намеревается сделать вещиПолегче реализовать только в другом домене (асинхронном). От PEP 525:

По сути, цели и обоснование для PEP 255, применяемые к случаю асинхронного выполнения, справедливы и для этого предложения.

Короче говоря, это делает написание объектов, которые поддерживаютпротокол асинхронной итерации легко. Какгенераторы сделал дляпротокол итератора.

Вместо того, чтобы определять объекты, которые реализуют__aiter__ а также__anext__ Вы создаете асинхронный генератор, который делает это, по-видимому, по волшебству. Это отражает то, что генераторы сделали для протокола итератора; вместо реализации__iter__ а также__next__ для объекта вы можете просто создать генератор.

Это хорошо отражено в рациональном PEP 525, который также включает в себя хороший пример, который показывает экономию, которую вы делаете в коде, написанном при использовании асинхронных генераторов.

В дополнение к экономии длины кода асинхронные генераторы также работают намного лучше:

Производительность является дополнительным моментом для этого предложения: при тестировании эталонной реализации асинхронные генераторы работают в 2 раза быстрее, чем аналог, реализованный в виде асинхронного итератора.

Просто добавьте сюда некоторую терминологию, потому что иногда становится трудно отслеживать термины:

Генераторы:def функции, содержащие один или несколькоyield выражения.Генератор сопрограммы: генератор (def + yield) который обернутtypes.coroutine, Вы должны обернуть это вtypes.coroutine если вам нужно, чтобы это считалось объектом сопрограммы.Асинхронный генератор:async def функции, содержащие один или несколькоyield выражения. Они также могут содержатьawait выражения.сопрограммная:async def без нуля или болееawaitс и нетyields.
 Tim13 сент. 2017 г., 22:32
Благодарю. В «Асинхронный генератор: асинхронные функции def, которые содержат выражение выхода», вы имеете в видуawait вместоyield?
 Jim Fasarakis Hilliard13 сент. 2017 г., 23:16
Генераторы @Tim используются в качестве производителей данных (онизначения доходности). Сопрограммы на основе генератора используются в качестве потребителей (вы.send значения для них или для суб-генератора ониyield from). Асинхронные генераторы являются асинхронными производителями данных (в то время как сопрограммы являются асинхронными потребителями данных).
 Tim19 окт. 2017 г., 14:44
Благодарю. Мне было интересно узнать о некоторых вопросах, касающихся производителя и потребителя, в вашем последнем комментарии,stackoverflow.com/questions/46822070/..., Меня также интересовал вопрос о терминологии «сопрограмма на основе генератора».stackoverflow.com/questions/46830144/...
 Tim13 сент. 2017 г., 22:59
В чем разница между «асинхронным генератором», сопрограммой на основе генератора и генераторами с точки зрения их целей? (не только с точки зрения их определения, которое вы описали)
 Jim Fasarakis Hilliard13 сент. 2017 г., 22:50
@ Нет, нет, если у вас есть толькоawait вasync def Вы получаете сопрограмму. Наличиеyield вasync def это то, что делает его асинхронным генератором :-).

Ваш ответ на вопрос