用法
引言
一个greenlet 是一个小型独立的假性线程。把它的框架想成一个小型栈。最外层(底部)框架是你调用的原始方程, 最外层框架是greenlet目前暂停的地方。通过创建一些这样的栈并且在它们之间跳转执行来使用greenlets。跳转从来不是隐式。一个greenlet必须选择跳到另一个greenlet,这会造成前一个greenlet暂停和后一个greenlet从之前暂停的地方开始。green lets之间的跳转称之为switching.
当你创建了一个greenlet,便初始化了一个空栈。当你第一次跳转到这个greenlet,它便开始执行一个特定的函数,这可能会调用其他函数,跳出这个greenlet等等。当最外层函数结束执行,那么这个greenlet的栈又空了,这个greenlet被称之为“死”了。Greenlets也可能因为没被捕捉到的异常而死。
举个例子:
from greenlet import greenlet
def test1():
print(12)
gr2.switch()
print(34)
def test2():
print(56)
gr1.switch()
print(78)
gr1 = greenlet(test1) //创建一个greenlet,最外层框架是test1
gr2 = greenlet(test2) //创建一个greenlet,最外层框架是test2
gr1.switch()
最后一行代码实现跳转到test1, 打印12,然后跳转到test2, 打印56,跳转回test1,打印34.此时test1执行完毕,gr1也死了。此时,执行重新回到原始的gr1.switch(). 注意78从来没被打印。
Parents
我们来看看当一个greenlet‘死’了执行将会去往何处。每个greenlet都有一个’parent’ greenlet. Parent greenlet 是最初这个greenlet创建的地方(可在任何时候被改变)。Parents 也是当这个greenlet死亡时程序重新执行的地方。通过这种方式,greenlets以树的方式组织起来。’main’函数就是这棵树的根。
Greenlets 和 Python 线程
Greenlets 可以同Python 线程结合起来。在上述例子中,每个线程包含一个独立的‘main’ greenlet 和一棵带有sub-greenlets的树。不能混合或者跳转到不属于同一个线程的greenlets中。