我希望通过键
获得龙卷风对象的价值这是我的代码:
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
当我执行此代码时,我有这个:
ok1
ok2
3
事实上我的结果我想要“3”,但我不明白为什么我的程序继续运行?为什么ioloop没有关闭?编译时我没有ok3
如何关闭ioloop并ok3
?
答案 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()