什么是协程
子程序, 或者称为函数, 在所有语言中都是层级调用, 比如A调用B, B在执行过程中又调用了C, C执行完毕返回, B执行完毕返回, 最后是A执行完毕. 所以子程序调用是通过栈实现的, 一个线程就是执行一个子程序。
子程序调用总是一个入口, 一次返回, 调用顺序是明确的。
协程看上去也是子程序, 但执行过程中, 在子程序内部可中断, 然后转而执行别的子程序, 在适当的时候再返回来接着执行。
注意, 在一个子程序中中断, 去执行其他子程序, 不是函数调用, 有点类似CPU的中断。
子程序可以看成协程的一种: 即没有内部中断的协程
和迭代器的区别:
迭代器每次调用 next() 执行的都是同一段代码逻辑, 但是协程可以执行不同的代码逻辑
在任何时刻, 只有一个协程在运行, 而 multiprocessing或threading 轮转使用操作系统调度的进程和线程, 是真正的并行
与多线程相比, 协程的优点在于:
避免了线程创建/切换带来的消耗
不需要多线程的锁机制
Go 一般把 goroutine 也称为协程
常规子程序
子程序执行完返回把控制权返还给调用这个子程序的上层,让上层继续往下执行,一层套一层,这就是层级调用。
特征:
执行完毕才返回
不可中断
协程
协程看上去也是子程序,但执行过程中,在子程序内部可中断,然后转而执行别的子程序,在适当的时候再返回来接着执行。
特征:
可以执行到一半先返回
可中断、挂起
再次执行可恢复状态
网友评论