协程 Coroutine
A coroutine is a function that can suspend its execution (yield) until the given given YieldInstruction finishes.
感觉意思就是用户定义的伪多线程(同多线程对业务逻辑所需的功能特点)。操作系统只规定了进程和线程。就是说,我一个线程的任务理应业务逻辑是一条线,但是我为了实现多个任务,切换执行,但是线程还是一条线,只是我改变了这条线的传统逻辑,操作系统不需要知道,我达到我的目的就好。
Go
func Add(x, y int) {
z := x + y
fmt.Println(z)
}
func main() {
for i:=0; i<10; i++ {
go Add(i, i)
}
}
Python
def consume():
while True:
# consumer 协程等待接收数据
number = yield
print("开始消费",number)
consumer = consume()
# 让初始化状态的 consumer 协程先执行起来,在 yield 处停止
next(consumer)
for num in range(0,100)
print("开始生产",num)
# 发送数据给 consumer 协程
consumer.send(num)
next跳转一个yield
send产生值给yield赋值对象
协程的好处
- 跨平台/跨体系架构
- 无需线程上下文切换的开销
- 无需原子操作锁定及同步的开销
- 方便切换控制流,简化编程模型
- 高并发+高扩展性+低成本:一个CPU支持上万的协程都不是问题,所以很适合用于高并发处理
协程的缺点
- 无法利用多核资源:协程的本质是个单线程,它不能同时将 单个CPU 的多个核用上,协程需要和进程配合才能运行在多CPU上.当然我们日常所编写的绝大部分应用都没有这个必要,除非是cpu密集型应用
- 进行阻塞(Blocking)操作(如IO时)会阻塞掉整个程序:这一点和事件驱动一样,可以使用异步IO操作来解决
协程需要锁吗?
- 单线程的多协程不需要
- 多线程多协程就需要了
就是多线程需要锁
协程比线程性能更好吗?
不一定。
因为协程不能利用多核(除非多线程),但是能相对好的处理IO。
参考
https://juejin.im/post/5b0014b7518825426e023666
https://juejin.im/post/5d5df6b35188252ae10bdf42
https://www.zhihu.com/question/20511233