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
  • 相关阅读:
    长春区域赛总结
    HDU 4297 One and One Story (LCA>RMQ)
    SRM 578 div1
    开学,网赛,压力。。。
    HDU 4291 A Short problem
    最大密集子图(POJ 3155)
    ubuntu安装sunjdk1.6
    【转】容斥原理
    生成树计数问题(SPOJ 104 Highways)
    Tonelli–Shanks Algorithm 二次剩余系解法 (Ural 1132. Square Root)
  • 原文地址:https://www.cnblogs.com/1zhangwenjing/p/7746167.html
Copyright © 2011-2022 走看看