Search code examples
pythonobjecttornadoamazon-elastic-beanstalk

How to get tornado object?


I want to get value of a tornado object with key

This is my code :

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

And this is the function `show()``

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

When I look at the documentation I found this : enter image description here

And when I excecute this code, I have this :

ok1
ok2
3

In fact I have the result I wanted "3" but I don't understand why my program continue to running? Whythe ioloop doesn't close? I don't have ok3when I compile how can I do to close the ioloop and have ok3?


Solution

  • beanstalk.stats_tube is async, it returns a Future which represents a future result that has not yet been resolved.

    As the README says, Your callback show will be executed with a dict that contains the resolved result. So you could define show like:

    def show(stateTube):
        pprint(stateTube['current-job-ready'])
    
    beanstalk.stats_tube('contracts', callback=show)
    
    from tornado.ioloop import IOLoop
    IOLoop.current().start()
    

    Note that you pass show, not show(): you're passing the function itself, not calling the function and passing its return value.

    The other way to resolve a Future, besides passing a callback, is to use it in a coroutine:

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