从generator到greenlet到stackless再到pypy,各家的语法都不太一样。pypy底层的实现是continulet,看名字应该是continuation的意思。然后在这个基础上实现了stackless的api和greenlet的api。这种实现都是在用户代码里,而不是在解释器的内置库里实现的。

from _continuation import continulet

def func(cont, a, b):
    print(a)
    cont.switch()
    print(b)

cont = continulet(func, 'hello', 'world')
cont.switch()
print('switched from continulet')
cont.switch()

代码的输出是

hello
switched from continulet
world

从使用的感觉上非常类似于greenlet。感觉就是把greenlet隐式的当前greenlet的概念变成了显式的第一个函数参数。Java的quasar的语法风格也是类似: http://docs.paralleluniverse.co/quasar/
所以从语法上来说就三类

  • generator这样强制要求yield的
  • greenlet为代表的隐式yield控制权的
  • stackless为代表强买强卖actor编码风格的

taowen
4.1k 声望1.4k 粉丝

Go开发者们请加入我们,滴滴出行平台技术部 taowen@didichuxing.com