@zlodiak

Чем отличается генератор от корутины?

Помогите пожалуйста понять чем корутина отличается от генератора. Вот типовые примеры:
https://ideone.com/GHYgtd
https://ideone.com/0lLATy

Я пока вижу только одно отличие - генератор нужно только один раз инициализировать значением, далее при каждой итерации он будет возвращать значения, вычисленные по определённому правилу. корутине же нужно при каждой итерации передавать значение, которое она будет преобразовывать тоже по определённому правилу.

Мне кажется, существуют и другие различия
  • Вопрос задан
  • 446 просмотров
Пригласить эксперта
Ответы на вопрос 3
longclaps
@longclaps
Ответ Дмитрий Шицков был бы хорош лет 5 назад, но сейчас нуждается в уточнении. PEP 492, все дела.

import asyncio, warnings, itertools

def a():
    for ch in 'foo':
        print(ch, 'from a')
        yield

@asyncio.coroutine
def b():
    for ch in 'foo':
        print(ch, 'from b')
        yield

async def c():
    for ch in 'foo':
        print(ch, 'from c')
        await asyncio.sleep(0)

print('как ни странно, здесь все три прокатывают\n')
loop = asyncio.get_event_loop()
tasks = [loop.create_task(f()) for f in (a, b, c)]
loop.run_until_complete(asyncio.wait(tasks))
loop.close()

print('\nмежду тем, есть нюансы\n')
with warnings.catch_warnings():
    warnings.simplefilter('ignore')
    dirs = [[*dir(f), *dir(f())] for f in (a, b, c)]
for s in sorted(set(itertools.chain(*dirs))):
    if not all(s in d for d in dirs):
        print(f'{s:14}', *['-+'[s in d] for d in dirs])

Видно, что a и b отличаются лишь тем, что b зарегистрирована как корутина, а вот c вовсе другая.
Займись этим вопросом, чо нароешь - отпишись.
Ответ написан
Корутина - частный случай генератора. Отличий нет, т.к. корутина и есть узкоспециализированный генератор.
https://habr.com/ru/post/196918/
Ответ написан
@MechanicZelenyy
Тем что корутина выполняется в отдельном асинхронном потоке?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы