zoukankan      html  css  js  c++  java
  • [原]初学python 协程(无锁生产者&消费者)

    引言:前几天看了一点InfoQ上大神们很多的总结,服务编程范式以这样的方式进化多进程--->多线程--->非阻塞--->协程。

    说说协程,找了一些关于GreenLet的资料,协程也称作微线程,是比线程还小的一种执行体。

    线程确实执行体就是一个函数,在用户空间看来,但是在内核中线程也是一个进程,LWP所谓的轻量级进程,线程也存在自己的上下文运行环境。

    协程不同于线程的是,线程是抢占式的调度,而协程是协同式的调度,也就是说,协程需要自己做调度。

    看看一个简单的消费者&生产者模型的python代码:

    def coroutine(func):
        def ret():
            f = func()
            f.next()
            return f
        return ret
    
    
    
    @coroutine
    def consumer():
        print "Wait to getting a task"
        while 1:
            n = (yield)
            print "Got %s",n
    
    
    
    import time
    def producer():
        c = consumer()
        while 1:
            time.sleep(1)
            print "Send a task to consumer"
            c.send("task")
    
    if __name__ == "__main__":
        producer()
    

    这里协程的调度是通过 send() 调用来传递任务,就是说,在producer执行期间,consumer是阻塞在 yield 表达式上。

    每一次send()都会传递值给相应的任务给consumer.

    总结:可以看出来,协程确实是一种轻量级的线程,调度策略取决于什么时候发送"消息"。关于其具体的实现还没有看过源码。不能妄加评论

    比较好的开源协程库 eventlet | greenlet 等

    文章属原创,转载请注明出处 联系作者: Email:zhangbolinux@sina.com QQ:513364476
  • 相关阅读:
    ZOJ 2158 Truck History
    Knight Moves (zoj 1091 poj2243)BFS
    poj 1270 Following Orders
    poj 2935 Basic Wall Maze (BFS)
    Holedox Moving (zoj 1361 poj 1324)bfs
    ZOJ 1083 Frame Stacking
    zoj 2193 Window Pains
    hdu1412{A} + {B}
    hdu2031进制转换
    openjudge最长单词
  • 原文地址:https://www.cnblogs.com/Bozh/p/2528302.html
Copyright © 2011-2022 走看看