#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). Это было бы намного сложнее сделать с помощью подпрограмм.
Но является ли аргумент отслеживания некоторого состояния единственной причиной использования сопрограмм? Я ищу эмпирическое правило, а не правило, которое охватывает все возможные случаи.