【问题标题】:Tornado: Unpack many layers of Future龙卷风:解开多层未来
【发布时间】:2017-05-20 21:59:50
【问题描述】:

在tornado 4.3 + python3中,如果我有很多层异步函数,例如:

@gen.coroutine
def layer_2():
    return(yield async_func())

@gen.coroutine 
def layer_1():
    return(yield layer_2())

@gen.coroutine
def main():
    return(yield layer_1())

由于异步函数返回一个 Future(产生这个 Future 返回它的结果),要在 main 中获得 async_func 的返回值,我必须:

  • 在每个被调用者中,将产生的 Future 包装在 return 语句中

  • 在每个调用者中,要将值向上传递到调用链,产生被调用者并再次在 return 语句中扭曲返回的值

有没有办法避免这种模式?

【问题讨论】:

    标签: python function asynchronous tornado future


    【解决方案1】:

    这是在 Tornado 中从协程调用协程的正确方法。没有“避免这种模式的方法”,实际上这就是协程的设计方式!

    有关详细信息,请参阅Tornado coroutines guide 或我的Refactoring Tornado Coroutines

    【讨论】:

    • 是的,我明白这一点,但这种方法不丑吗(重复代码)?我能想到的一种方法是在main() 中继续让步,直到返回的结果不再是未来。
    • 这就是协程的工作方式。没有比普通 Python 函数都需要“return”关键字更多的“重复”了。
    • 谢谢!只是想仔细检查一下 SO 蜂巢思维,以防我错过任何东西。我已将您的答案标记为正确!
    猜你喜欢
    • 2018-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多