【问题标题】:Need help on tornado coroutines需要有关龙卷风协程的帮助
【发布时间】:2015-05-12 18:14:37
【问题描述】:

我是 python 和龙卷风的新手。我正在尝试一些使用协程的东西。

def doStuff(callback):
    def task():
        callback("One Second Later")
    Timer(1,task).start()

@gen.coroutine
def routine1():    
    ans = yield gen.Task(doStuff)
    raise gen.Return(ans)

if __name__ == "__main__":
    print routine1()

我正在尝试获取 doStuff() 函数的结果,我希望它是“一秒钟后”。但它不起作用。任何帮助,将不胜感激。谢谢

【问题讨论】:

  • 什么是“定时器”?我可以看看它的源代码吗?或者你能告诉我 Timer 是从哪里导入的吗?
  • 定时器在给定时间(秒)后异步调用传递的函数。它存在于python的“线程”包中。
  • 除非你真的知道自己在做什么,否则不要混合使用线程和 Tornado。改为yield gen.sleep(1)tornado.readthedocs.org/en/latest/gen.html#tornado.gen.sleep

标签: python python-2.7 tornado


【解决方案1】:

可能发生的情况是,您还没有启动 IOLoop,也没有在脚本退出之前等待协程完成。您可能会注意到您的脚本在几毫秒内运行,而不是应该暂停一秒钟。这样做:

if __name__ == "__main__":
    from tornado.ioloop import IOLoop
    print IOLoop.instance().run_sync(routine1)

【讨论】:

  • 感谢杰西的帮助。但是脚本运行大约一秒钟。会不会是 Timer 的原因?
  • 啊,由于定时器线程不是守护进程,我猜进程在退出之前等待定时器线程。
  • 非常感谢您的帮助。您能否推荐一些书籍,以便我了解有关龙卷风的更多信息?
  • 没有任何最近的书籍,但 Ben Darnell 在最近的版本中极大地改进了文档,请参阅 tornadoweb.org/en/stable/guide.html
猜你喜欢
  • 2018-10-10
  • 2013-10-07
  • 2015-03-16
  • 2018-04-26
  • 2011-10-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多