如何获得龙卷风对象?

时间:2016-10-10 14:38:43

标签: python object tornado elastic-beanstalk

我希望通过键

获得龙卷风对象的价值

这是我的代码:

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")

这是函数`show()``

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

当我查看文档时,我发现了这个: enter image description here

当我执行此代码时,我有这个:

ok1
ok2
3

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

1 个答案:

答案 0 :(得分:2)

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

作为the README says,您的回调show将使用包含已解析结果的dict执行。因此,您可以定义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():您正在传递函数本身,而不是调用函数并传递其返回值。

除了传递回调之外,解决Future的另一种方法是在协程中使用它:

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()