2016-10-10 75 views
0

我想与关键如何获取龙卷风对象?

龙卷风对象的值。这是我的代码:

beanstalk = beanstalkt.Client(host='host', port=port) 
beanstalk.connect() 
print("ok1") 

beanstalk.watch('contracts') 
stateTube = beanstalk.stats_tube('contracts', callback=show) 
print("ok2") 

ioloop = tornado.ioloop.IOLoop.instance() 
ioloop.start() 

print("ok3") 

这是函数`显示()``

def show(s): 
    pprint(s['current-jobs-ready']) 
    ioloop.stop 

当我看在我发现这个文件: enter image description here

而当我优先考虑这段代码时,我有这样的:

ok1 
ok2 
3 

事实上,我有我想要的结果“3”,但我不明白为什么我的程序继续运行?为什么ioloop不关闭?我编译时没有ok3我该怎么办才能关闭ioloop并有ok3

+0

你有一个'Future'对象。请显示您试图称之为 –

+0

@ cricket_007的龙卷风代码,我已更新我的帖子 – wxcvbn

回答

2

beanstalk.stats_tube是异步的,它返回一个Future它代表未来的结果尚未解决。

由于the README says,您的回调show将执行一个包含解析结果的字典。所以,你可以定义show,如:

def show(stateTube): 
    pprint(stateTube['current-job-ready']) 

beanstalk.stats_tube('contracts', callback=show) 

from tornado.ioloop import IOLoop 
IOLoop.current().start() 

请注意,您通过show,不show():你传递函数本身,而不是调用函数并传递它的返回值。

另一种方式来解决未来,除了传递一个回调,是一个协程使用它:

from tornado import gen 
from tornado.ioloop import IOLoop 

@gen.coroutine 
def get_stats(): 
    stateTube = yield beanstalk.stats_tube('contracts') 
    pprint(stateTube['current-job-ready']) 

loop = IOLoop.current() 
loop.spawn_callback(get_stats) 
loop.start() 
+0

我已编辑我的帖子。我尝试做第一种方法,但我遇到了一些问题... – wxcvbn

+0

没关系,我找到了解决方案!非常感谢 ! – wxcvbn

+0

我发布了一个关于异常的新问题到回调:[here](http://stackoverflow.com/questions/39974225/tornado-how-to-return-error-exception)你能帮助我吗? – wxcvbn