2016-10-10 11 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 is async, он возвращает 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(): вы передаете саму функцию, не вызывая функцию и передавая ее возвращаемое значение.

Другой способ решить будущее, помимо прохождения обратного вызова, чтобы использовать его в сопрограммы:

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

Я отправляю новый вопрос об исключении в обратный вызов: [здесь] (http://stackoverflow.com/questions/39974225/tornado-how-to-return-error-exception) можете ли вы мне помочь? – wxcvbn