gevent的碎碎念(一)——greenlet

参考链接:http://www.pythontip.com/blog/post/13094/

一、概述

       一个greenlet是一个任务调度器和一堆生成器实现的伪并发的一个微线程,主要思想是:生成器或协程函数中的yield挂起,之后用next()或send()恢复,使得调度器可以循环在一组生成器函数间协作任务。

二、对比进程,线程

1. 线程/进程模型在大逻辑上通常从并发角度开始考虑,把能够并行处理的并且值得并行处理的任务分离出来,在不同的线程/进程下运行,然后考虑分离过程可能造成哪些互斥、冲突问题,将互斥的资源加锁保护来保证并发处理的正确性。

2. greenlet则是要求从避免阻塞的角度来进行开发,当出现阻塞时,就显式切换到另一段没有被阻塞的代码段执行,直到原先的阻塞状况消失以后,再人工切换回原来的代码段继续处理。因此,greenlet本质是一种合理安排了的 串行 。

3. greenlet本质是串行,因此在没有进行显式切换时,代码的其他部分是无法被执行到的,如果要避免代码长时间占用运算资源造成程序假死,那么还是要将greenlet与线程/进程机制结合使用(每个线程、进程下都可以建立多个greenlet,但是跨线程/进程时greenlet之间无法切换或通讯)。

三、在gevent中

        这里是为了gevent而说明greenlet的,因此就说说gevent里面的greenlet。

        gevent两大法宝就是greenlet和libev事件循环来提供高并发API,主要特性:       

  • 基于libev的快速事件循环,Linux上面的是epoll机制

  • 基于greenlet的轻量级执行单元

  • API复用了Python标准库里的内容

  • 支持SSL的协作式sockets

  • 可通过线程池或c-ares实现DNS查询

  • 通过monkey patching功能来使得第三方模块变成协作式

        epoll机制之后特别研究

相关文章
相关标签/搜索