• 协程


    子程序

    子程序(函数)在所有语言中都是层级调用,比如A 调用B,B调用C,C执行完毕返回,B执行完毕返回,最后A执行完。

    子程序调用是通过栈实现,一个线程执行一个子程序。

     

    协程

    看上去也是子程序,执行时,在程序内部可中断(不是函数调用,有点类似于CPU中断),转去执行别的子程序,在适当的时候再返回来接着执行。

    协程的特点在于是一个线程执行。

     

    协程的优势:

      1极高的执行效率,因为子程序切换不是线程切换,因此没有线程切换的开销。

      2不需要多线程的锁机制。在协程中控制共享资源不加锁,只需要判断状态就好了。

     

    协程是一个线程执行,那怎么利用多核CPU?多进程+协程

     

    python对协程的支持是通过generator实现的。

    在generator中,可以通过调用next()函数获取有yield语句返回的下一个值。

    python的yield语句不但可以返回一个值,还可以接收调用者发出的参数。!!

     

    Python生成器generator之next和send运行流程

     

    生产者-消费者案例:

     

    def consumer():
        r = ''
        while True:
            n = yield r
            if not n:
                return
            print('[CONSUMER] Consuming %s...' % n)
            r = '200 OK'
    
    def produce(c):
        c.send(None)
        n = 0
        while n < 5:
            n = n + 1
            print('[PRODUCER] Producing %s...' % n)
            r = c.send(n)
            print('[PRODUCER] Consumer return: %s' % r)
        c.close()
    
    c = consumer()
    produce(c)

     输出:

    [PRODUCER] Producing 1...
    [CONSUMER] Consuming 1...
    [PRODUCER] Consumer return: 200 OK
    [PRODUCER] Producing 2...
    [CONSUMER] Consuming 2...
    [PRODUCER] Consumer return: 200 OK
    [PRODUCER] Producing 3...
    [CONSUMER] Consuming 3...
    [PRODUCER] Consumer return: 200 OK
    [PRODUCER] Producing 4...
    [CONSUMER] Consuming 4...
    [PRODUCER] Consumer return: 200 OK
    [PRODUCER] Producing 5...
    [CONSUMER] Consuming 5...
    [PRODUCER] Consumer return: 200 OK

      

     
    如有疑问请联系我,写的不对的地方请联系我进行更改,感谢~ QQ:1968380831
  • 相关阅读:
    js的发布订阅者模式
    js打开PC的应用程序
    用node创建自己的脚手架
    用Navicat生成数据字典的方法
    Windows 11 前端基本配置【20210127】
    【win11右键】关于解决Win11环境下 vscode 重装后,不在鼠标右键的快捷栏里面
    【win11右键】关于在win11环境让鼠标右键直接显示全部功能的设置
    小程序开发 各种Demo的记录博客
    Android开发 Paging3
    adb命令 shell工具类
  • 原文地址:https://www.cnblogs.com/1zhangwenjing/p/7746167.html
Copyright © 2020-2023  润新知