python tornado - 如何返回实时数据

时间:2015-04-13 21:19:23

标签: python websocket tornado

我在python中使用龙卷风库。我有一个添加数据的队列。我必须保持连接打开,这样当客户端请求我从队列发出项目时。这是我的一个简单实现。我面临的问题是当我向queue添加新元素时,我不会看到它被返回。事实上,我没有在IOLoop.current().start()行下面看到任何代码。

from tornado.ioloop import IOLoop
from tornado.web import RequestHandler, Application, url,asynchronous
from Queue import Queue

import json

q=Queue()
q.put("one")
q.put("two")

class HelloHandler(RequestHandler):
    def get(self):
        data=q.get()
        self.write(data)

def make_app():
     return Application([
         url(r"/", HelloHandler),
         ])

def main():
    app = make_app()
    app.listen(8888)
    IOLoop.current().start() # stops here
    time.sleep(2)
    q.put("three")
    print q

if __name__=='__main__':
    main()

第一次: http://localhost:8888/

返回“one”

第二次:

http://localhost:8888/

返回“两个”

此次第三次“

http://localhost:8888/

阻断

1 个答案:

答案 0 :(得分:2)

你遇到的问题是调用IOLoop.current()。start()将控制转移到Tornado。它循环直到调用IOLoop.stop()

如果您需要在IOLoop启动后执行某些操作,则可以使用其中一个回调。例如,您的代码已修改为使用IOLoop.call_later()。如果您使用的是早期(< 4.0)版本的Tornado,也可以使用IOLoop.add_timeout()

from tornado.ioloop import IOLoop
from tornado.web import RequestHandler, Application, url,asynchronous
from Queue import Queue

import json

q=Queue()
q.put("one")
q.put("two")

class HelloHandler(RequestHandler):
    def get(self):
        data=q.get()
        self.write(data)

def make_app():
     return Application([
         url(r"/", HelloHandler),
         ])

def main():
    app = make_app()
    app.listen(8888)
    IOLoop.current().call_later(2, q.put, "three")
    IOLoop.current().start()

if __name__=='__main__':
    main()