【问题标题】:How to get tornado object?如何获得龙卷风对象?
【发布时间】:2016-10-11 15:40:37
【问题描述】:

我想用 key 获取 tornado 对象的值

这是我的代码:

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

【问题讨论】:

  • 你有一个Future 对象。请显示您尝试调用的龙卷风代码
  • @cricket_007,我已经更新了我的帖子

标签: python object tornado amazon-elastic-beanstalk


【解决方案1】:

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

【讨论】:

  • 我已经编辑了我的帖子。我尝试了第一种方法,但我遇到了一些问题......
  • 没关系,我找到了解决方案!非常感谢!
  • 我在回调中发布了一个关于异常的新问题:here 你能帮帮我吗?
猜你喜欢
  • 1970-01-01
  • 2018-11-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多