coroutine
传统意义上的协程是指:将比较耗时的任务通过切片的方式,将几个这样的任务做到逻辑上的平行执行,来达到增强运行效率的目的:
假设有两个因为IO或者网络需要各自阻塞一定时间的任务,它们分别需要:
A : 10s CPU时间 > 10s IO时间 > 10s CPU时间 > 10s IO时间
B : 10s CPU时间 > 10s IO时间 > 10s CPU时间 > 10s IO时间
现在假设只有一个CPU,如果现在需要发起A、B,并需要等待AB两个任务的结果再继续执行下一步,如果使用传统的多线程,可能会发生这样的事情:
A : 10s CPU时间 > 10s IO时间 > 10s CPU时间 > 10s IO时间
B : 10s CPU时间 > 10s IO时间 > 10s CPU时间 > 10s IO时间
| 多线程执行,| 两边同时IO | 假设A先完成 | A在上一步先完
| AB争夺片轮 | 对IO操作发 |IO操作,领先B| 成操作,因此A
|忽略切换损耗 |生阻塞,假设|所以没有IO争夺| 在这一步领先B
| 总耗时20s | A先完成操作| 各自花费10s | 无冲突,各自耗时10s
| | A花费10s |
| | B花费20s |
A耗时 20 + 10 + 10 + 10 = 50s
B耗时 20 + 20 + 10 + 10 = 60s
由于需要等待两个任务全部完成 整个操作耗时60s
现在如果我们能够这样安排任务
A : 10s CPU时间 > 10s IO时间 > 10s CPU时间 > 10s IO时间
| A执行CPU | A 执行IO | A 执行CPU | A 执行IO
| 花费 10s | 10s | 10s | 10s
| B等待,10s | IO与CPU不冲 | B 执行IO | B 执行CPU |B 执行IO
| | 突,10s | 10s | 10s |10s
B : (轮空) > 10s CPU时间 > 10s IO时间 > 10s CPU时间 > 10s IO时间
A耗时 10 + 10 + 10 + 10 = 40s
B耗时 10 + 10 + 10 + 10 + 10 = 50s
由于需要等待两个任务全部完成 整个操作耗时50s
可以看到,在一些情况下(高IO 高并发等),合理安排任务的终止和等待,比起直接一股脑地多线程效率要高。
GS提供的协程机制是一个综合性较强的、横跨语言各个功能的综合性系统。当开发者在尝试调用一些占用资源的耗时操作(文件、IO、网络等)时,GS虚拟机在一定程度上会自动对协程进行调度,保证资源被合理利用。