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
  • 相关阅读:
    【C/C++】小坑们
    【CUDA】Windows 下常用函数头文件
    【OS】Heap & Stack
    【C/C++】Rotate Array
    【C/C++】泛型栈
    【IDE】我的花里胡哨VS
    【PAT】我要通过!
    【C/C++】内存基础
    【CUDA】Win10 + VS2017新 CUDA 项目配置
    【LeetCode】不同路径
  • 原文地址:https://www.cnblogs.com/Bozh/p/2528302.html
Copyright © 2011-2022 走看看