tornado 的 coroutine 能和自定义的装饰器一起使用吗??

2016-04-07 11:45:17 +08:00
 triThirty

试了下使用 tornado 的 coroutine 和自已定义的一个 decorator 一起使用,但发现不会在 yield 出挂起,而是向上返回。 就是说,如果有多层嵌套的话,在运行到最底层的 yield 处之后,程序不会运行 yield 之后的代码,而是向上返回一个空的 future ,而且上层代码也不会执行 yield 之后的代码而是继续向上返回。 不知道有没有大神能给出一个例子,将 coroutine 和自定义的装饰器一起使用的例子,或者说能指出怎么使用。谢谢

9088 次点击
所在节点    Tornado
3 条回复
calease
2016-04-07 13:32:06 +08:00
decorator 只不过是把原先的 function 替换成 wrapper ,唯一要注意的就是你的 decorator 最好放在上面,并且自己也要是 coroutine 。比如:

def sleeper(func):
@coroutine
def wrapper(*args, **kwargs):
yield tornado.gen.sleep(1)
# here func is actually a get wrapped by coroutine, so yield it
yield func(*args, **kwargs)
return wrapper

@sleeper
@coroutine
def get(*args, **kwargs):
# code goes here
self.write("just get it")


放下面的情况比较复杂一时说不完,且听下回分解。
triThirty
2016-04-07 13:52:01 +08:00
@calease 感谢大神~~~~~
wingyiu
2016-04-12 10:17:53 +08:00
@calease
import
inspect.isgeneratorfunction(foo)

如果是就 yield 咯 不是就随意咯

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/269198

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX