Есть ли хороший пример реального мира для сопрограмм
В настоящее время я много читаю о сопрограммах. Хотя я думаю, что только частично понимаю, что они делают (например, разрешают возвращать и продолжать функцию в определенный момент), я действительно не знаю, почему мне следует их использовать. Я не вижу никакой реальной пользы в использовании сопрограммы. Для меня эти вещи похожи на goto с дополнительными шагами. Может ли кто-нибудь дать мне хороший пример из реальной жизни, где сопрограмма действительно может улучшить кодовую базу? Может быть, это помогает мне понять концепцию.
1 ответ
Сопрограммы позволяют нам моделировать совместные многозадачные системы очень простым и модульным способом. Этот тип систем может удовлетворить многие проблемы, такие как игры с несколькими агентами, симуляторы фондового рынка, операционные системы и т. Д.
Простота проистекает из того факта, что нам могут понадобиться только две функциональные сопрограммы для выражения концепции в коде. Классы, государственные структуры, указатели на функции больше не требуются. Ниже приведена иллюстрация псевдокода, которая определяет scheduler
и task
, В отличие от обычных функций, оба экземпляра task
передать исполнение друг другу после do_one_step
вызов.
void scheduler(list<task> tasks) {
while(true) {
for(t : tasks)
await t;
}
}
void task(int arg) {
while(1) {
do_one_step(arg);
yield;
}
}
void main() { await scheduler( list( { task(0), task(1) } ); }
Что еще более важно, код для task
теперь может быть модульным: задачи могут включать в себя подзадачи, которые напоминают его структуру. Любая подзадача может быть задана как правильная задача:
void subtask(int arg) {
do_one_step(arg);
yield;
do_one_step(arg);
yield;
}
void task(int arg) {
while(1) {
await subtask(arg);
yield;
}
}
void main() { await scheduler( list({task(0), task(1), subtask(2)}); }
Сопрограммы позволяют нам объединять подзадачи в более крупные задачи и предоставляют нам новый инструмент для модульной реализации наших решений.