greenlet

greenlet
  greenlet是一个提供“协程”的库。
  greenlet并不是用Python语言编写的,而是使用C语言(含有少量汇编)编写的库。可以使用pip install greenlet或easy_install greenlet安装greenlet。在Linux平台上,greenlet库提供功能的是一个动态链接库文件greenlet.so。
  一个“greenlet”是一个小而独立的“伪线程”。通过建立多个“伪线程”可以使用IO的多路复用,进而提高程序的执行效率。
  可以通过下面的例子理解greenlet:

from greenlet import greenlet

def func1():
    print(1.1)
    gr2.switch()
    print(1.2)

def func2():
    print(2.1)
    gr1.switch()
    print(2.2)

gr1 = greenlet(func1)
gr2 = greenlet(func2)
gr1.switch()

  程序输出:

1.1
2.1
1.2


  greenlet库中包含一个关键的类:greenlet。类greenlet可以将可调用对象包装成greenlet实例,函数是最简单的可调用对象。上面的例子中,将函数func1和函数func2包装成了两个greenlet的实例,分别为gr1和gr2。greenlet实例创建之后不会自动执行可调用对象,而是需要显示地调用方法switch()。例子中最后一行gr1.switch()会激活并开始执行函数func1,执行print(1.1)打印出1.1,gr2.switch()指示程序“切换到”func2,执行func2中的print(2.1)打印出2.1,执行gr1.switch()指示程序“切换到”func1,此时并不是重新执行函数func1,而是“继续执行”函数func1,执行print(1.2)输出1.2,接着退出函数func1,最后退出整个程序。
  有多个库使用greenlet,例如:
gevent
eventlet

参考资料:
  greenlet: Lightweight concurrent programming
  greenlet PyPI