协程 Coroutine

协程 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

发布了158 篇原创文章 · 获赞 7 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/LU_ZHAO/article/details/104941630