zoukankan      html  css  js  c++  java
  • 协程

    子程序

    子程序(函数)在所有语言中都是层级调用,比如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
  • 相关阅读:
    SpringBoot入门教程(十六)@Autowired、@Inject、@Resource
    SpringBoot入门教程(十五)集成Druid
    SpringBoot入门教程(十四)导出Excel
    SpringBoot入门教程(十三)CORS方式实现跨域
    SpringBoot入门教程(十二)DevTools热部署
    SpringBoot入门教程(十一)过滤器和拦截器
    1 谷歌book初始化配置-开启开发者模式
    47 VNC远程桌面
    46 温湿度传感器 dh11
    博士毕业要求
  • 原文地址:https://www.cnblogs.com/1zhangwenjing/p/7746167.html
Copyright © 2011-2022 走看看