请稍侯

Python协程入门(greenlet)

01 April 2015

一个例子

from greenlet import greenlet

def test1(name):
    print name
    gr2.switch()
    print "over"

def test2():
    print "test-2"
    return "test2-fjsfjs"

    
gr1 = greenlet(test1)
gr2 = greenlet(test2)
value = gr1.switch("fjsfjs")

print gr1.parent
print gr2.parent
print greenlet.getcurrent()
print value

输出结果:

fjsfjs
test-2
<greenlet.greenlet object at 0x0000000002465508>
<greenlet.greenlet object at 0x0000000002465508>
<greenlet.greenlet object at 0x0000000002465508>
test2-fjsfjs

解释

看到test1的最后那个输出并没有打印出来程序就已经结束了,也就是gr2执行完了之后,代码的执行并没有在test1返回,而是直接在最外层开始继续运行。。。而且返回结果也是直接到了最外层,而不是在test1中。。。

这个是为什么呢。。? 在greenlet模块的初始话的时候,就会先建立一个最顶层的greenlet对象,他属于greenlet层次关系中的root节点,接下来在创建greenlet的时候,如果在构造函数中并没有指明parent对象,那么构建出来的greenlet对象将会默认将当前环境所在的greenlet作为parent,当这个greenlet对象执行完成之后,将会调度其parent继续执行,而且会将返回参数也传递过去。

参考

  • http://blog.csdn.net/fjslovejhl/article/details/38821673