greenlet:轻量级并发编程

用法

引言

一个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中。

原文

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值