V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Tornado Documentation
http://www.v2ex.com/tornado/
Tornado on GitHub
https://github.com/facebook/tornado/
Tornado Gists
http://tornadogists.org/
triThirty
V2EX  ›  Tornado

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

  •  
  •   triThirty · 2016-04-07 11:45:17 +08:00 · 9548 次点击
    这是一个创建于 3136 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    3 条回复    2016-04-12 10:17:53 +08:00
    calease
        1
    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
        2
    triThirty  
    OP
       2016-04-07 13:52:01 +08:00
    @calease 感谢大神~~~~~
    wingyiu
        3
    wingyiu  
       2016-04-12 10:17:53 +08:00
    @calease
    import
    inspect.isgeneratorfunction(foo)

    如果是就 yield 咯 不是就随意咯
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1756 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 16:43 · PVG 00:43 · LAX 08:43 · JFK 11:43
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.