目前我正在阅读很多关于协同程序的内容。 虽然我认为我只是部分理解他们做了什么(例如允许函数返回并在某个时间点继续),但我真的不知道为什么要使用它们。我认为使用协程没有任何实际好处。对我来说,这些东西看起来像是通过额外的步骤转到。有人能给我一个很好的真实世界的例子,其中一个协程真的可以改善代码库吗?也许这有助于我获得这个概念。
答案 0 :(得分:0)
协同程序允许我们以非常简单和模块化方式对cooperative multitasking系统进行建模。这种系统可能适用于多代理游戏,股票市场模拟器,操作系统等许多问题。
简单来自于这样一个事实:我们可能只需要两个类似函数的协同程序来表达代码中的概念。不再需要类,状态结构,函数指针。以下是伪代码插图,其中定义了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)}); }
协同程序允许我们将子任务堆叠到更大的任务中,并为我们提供了一种新的工具来模块化我们的解决方案。