帮助您使用gevent编写代码
greenlight的Python项目详细描述
greenlight是一个功能强大的装饰器,可以帮助您使用gevent编写代码。 您可以将现有函数装入一个绿色列表中运行:
>>> from greenlight import greenlight >>> from gevent.greenlet import Greenlet >>> @greenlight ... def async_squaring(n): ... "An extremely useful function" ... return n**2 ... >>> g = async_squaring(10) >>> isinstance(g, Greenlet) True >>> g.get() 100
更有趣的是,你可以在一个绿色的发电机里连锁小绿叶 (类似于twisted的inlineCallbacks)。这就省去了样板间的事 否则必须对每个函数调用gevent.spawn(),然后 link()它们在一起,或者,也许,对每一个调用join()或get()。 并将结果传递给下一个。使用greenlight,您只需屈服于 内联获取结果:
>>> @greenlight ... def square_thrice(n): ... squared = yield async_squaring(n) ... tothe4th = yield async_squaring(squared) ... tothe8th = yield async_squaring(tothe4th) ... >>> square_thrice(2).get() 256
由于greenlit函数总是返回greenlet本身,因此可以编写代码 与通常使用的同步代码非常相似,同时仍然确保 执行顺序,只需将greenlit函数链接在一起。
可以使用 green_return函数。如果不使用green_return,则 返回最后生成的greenlet(如前一个示例所示):
>>> from greenlight import green_return >>> @greenlight ... def greater_than_100(): ... a = 2 ... while True: ... a = yield async_squaring(a) ... if a>100: ... green_return(a) ... >>> greater_than_100().get() 256
错误处理工作正常:
>>> @greenlight ... def something_bad(): ... raise Exception('O NOES') ... >>> @greenlight ... def main(): ... try: ... hundred = yield async_squaring(10) ... yield something_bad() ... except Exception, e: ... print e ... green_return(None) ... >>> main().get() O NOES
greenlight的行为通常类似于gevent.spawn,因为它为 你。如果不希望发生这种情况,可以使用greenlight_nostart:
>>> from greenlight import greenlight_nostart as greenlight >>> @greenlight ... def squared(n): ... return n**2 ... >>> g = squared(4) >>> g.started False >>> g.start(); g.get() 16