Что оправдывает использование сопрограмм вместо подпрограмм?

#coroutine #rules #subroutine

Вопрос:

В настоящее время я изучаю сопрограммы на Python, но у меня возникли трудности с определением того, когда их использовать по сравнению с обычными подпрограммами. Я пытаюсь объяснить свою проблему с помощью примера.

Задача состоит в том, чтобы выполнить итерацию по табличным данным и отформатировать содержимое строки в соответствии с ее записью в type поле. При форматировании результат записывается в тот же выходной файл.

 index | type | time | content
-----------------------------
0     | A    | 4    | ...
1     | B    | 6    | ...
2     | C    | 9    | ...
3     | B    | 11   | ...
...
 

Обычно я бы проверил тип и написал какой-то случай переключения и делегировал данные определенной подпрограмме (== функции), например так (псевдокод):

 outfile = open('test.txt')

for row in infile:

    switch(row.type)
    {
    case A:
        format_a(row.content, outfile)    // subroutine that formats and writes data of type A
        break

    case B:
        format_b(row.content, outfile)    // same for type B...
        break

    case C:
        format_c(row.content, outfile)    // ... and type C
        break

    default:
        // handle unknown type exception
        break
    }

close(outfile)
 

Вопрос в том, получу ли я какую-либо выгоду от реализации этого с помощью сопрограмм? Я так не думаю, и позвольте мне объяснить, почему: если бы я определил тип строки, я бы передал содержимое в соответствующую сопрограмму. Пока я это делаю, другие сопрограммы и вызывающая функция приостанавливаются. Данные форматируются и записываются в файл и передают управление обратно вызывающей функции, которая получает следующую строку и т.д. Эта процедура повторяется до тех пор, пока у меня не кончатся строки. Таким образом, это именно то, как будет выглядеть рабочий процесс с использованием подпрограмм.

Один профессионал в использовании сорутинов здесь был бы, если бы мне нужно было отслеживать какое-то состояние. Возможно, меня интересует разница во времени до последней строки для каждого типа. В этом случае функция сопрограммы для B сэкономит время ее первого вызова (6). Когда он вызывается во второй раз, он извлекает значение (11) и может вычислить разницу (11 — 6 = 5). Это было бы намного сложнее сделать с помощью подпрограмм.

Но является ли аргумент отслеживания некоторого состояния единственной причиной использования сопрограмм? Я ищу эмпирическое правило, а не правило, которое охватывает все возможные случаи.