Python 使用gen.coroutine’;Tornado中的s回调参数
正在寻找一个简单的示例,演示如何使用的Python 使用gen.coroutine’;Tornado中的s回调参数,python,python-3.x,asynchronous,tornado,Python,Python 3.x,Asynchronous,Tornado,正在寻找一个简单的示例,演示如何使用的回调参数。文件说: 带有[code>gen.coroutine]装饰器的函数返回一个Future。此外,可以使用回调关键字参数调用它们,当将来的结果解析时,将调用该参数 根据《文档用户指南》,我认为我可以做到: from tornado import gen @gen.coroutine def divide(x, y): return x / y @gen.coroutine def good_call(): yield divide(
回调
参数。文件说:
带有[code>gen.coroutine]装饰器的函数返回一个Future
。此外,可以使用回调
关键字参数调用它们,当将来的结果解析时,将调用该参数
根据《文档用户指南》,我认为我可以做到:
from tornado import gen
@gen.coroutine
def divide(x, y):
return x / y
@gen.coroutine
def good_call():
yield divide(1, 2)
good_call(callback=print)
我希望它打印0.5
,但没有输出
我发现了大量的例子来演示不推荐的decorator,但是
gen.coroutine
上似乎没有那么多。在Python 3.5.1和Tornado 4.3上运行。您仍然需要启动IOLoop。如果在脚本末尾添加tornado.ioloop.ioloop.current().start()
,您将看到输出被打印出来(然后ioloop
将永远运行。如果希望它停止,您需要在打印后从回调中执行此操作)
请注意,一般情况下,只使用协程和
yield
编写Tornado应用程序是可能的(并且受到鼓励),而不直接传递任何回调 这是蟒蛇吗。。。请尝试sys.stdout.write
而不是print(因为print是py2中的一个语句),有关更多示例,请参阅.@a.JesseJiryuDavis,谢谢。我读过那篇文章,但它没有包含使用回调
参数的示例。我建议不要尝试混合使用协程和回调。谢谢。我启动了循环,但输出是None
,而不是0.5
。我试着调试,但所有的杂技都失败了。(我将尽量避免使用callback
参数,但仍然想了解为什么这不起作用。)它没有按预期工作,因为good_call
必须返回将传递给callback的内容。使用good_call
中的return(收益率除以(1,2))
。我会解释这句话“原始的未来版本更复杂,但在Tornado中,期货仍然是推荐的做法…”让我们相信Tornado希望我们使用期货编写应用程序(并向期货添加回调)。。。我是否误解了这一点?我们鼓励您使用协同程序,它构建在后台的未来之上,但主要隐藏应用程序的未来和回调。