Python сопрограмма / генератор терминологии в асин c контексте - PullRequest
1 голос
/ 29 марта 2020

Из Интернета он говорит:

Когда у вас есть асинхронная функция (сопрограмма) в Python, вы объявляете ее с помощью asyn c def, которая изменяет поведение ее вызова. В частности, вызов его немедленно вернет объект сопрограммы, который в основном говорит: «Я могу запустить сопрограмму с аргументами, которые вы вызывали, и вернуть результат, когда вы меня ждете»

Так что, когда Вы вызываете функцию async без ожидания, вы получите сопрограмму.

Почему я возвращаю сопрограмму, а не просто генератор ? Потому что я не буду отправлять какие-либо будущие комментарии к нему.

1 Ответ

1 голос
/ 29 марта 2020

Когда сопрограммы впервые появились в Python 3.4, они были реализованы с использованием генераторов:

import asyncio
from typing import Generator


@asyncio.coroutine
def test1():
    pass


assert isinstance(test1(), Generator)

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


Начиная с Python 3.5 сопрограммы получили новый синтаксис async def / await, который одновременно чище и помогает различать guish абстракция (сопрограмма) от его реализации подробно (генератор).

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

async def test2():
    pass


assert not isinstance(test2(), Generator)

Короче говоря, забудьте о генераторах, когда дело с сопрограммами. Если вы работаете с абстракциями asyncio, такими как сопрограммы, вам следует работать с ними, а не с деталями их реализации.

...