0

目前我正在阅读很多关于协程的内容。虽然我认为我只部分了解了它们的作用(例如,允许返回一个函数并在某个时间点继续),但我真的不知道为什么要使用它们。我认为使用协程没有真正的好处。对我来说,这些东西在我看来就像带有额外步骤的 goto。有人可以给我一个很好的现实世界的例子,协程可以真正改善代码库吗?也许这有助于我理解这个概念。

4

1 回答 1

0

协程允许我们以非常简单模块化的方式对协作多任务系统进行建模。这种系统可能适合许多问题,如多智能体游戏、股市模拟器、操作系统等。

简单性来自于我们可能只需要两个类似函数的协程就可以在代码中表达这个概念。不再需要类、状态结构、函数指针。scheduler下面是定义 a和 a的伪代码说明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)}); }

协程允许我们将子任务堆叠成更大的任务,并为我们提供了一种新工具来模块化我们的解决方案。

于 2018-06-10T22:09:59.480 回答