@zlodiak

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

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

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

Мне кажется, существуют и другие различия
  • Вопрос задан
  • 1450 просмотров
Пригласить эксперта
Ответы на вопрос 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
Тем что корутина выполняется в отдельном асинхронном потоке?
Ответ написан
Ваш ответ на вопрос

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

Похожие вопросы
23 нояб. 2024, в 22:03
3000 руб./за проект
23 нояб. 2024, в 21:53
30000 руб./за проект
23 нояб. 2024, в 21:49
1000 руб./в час