簡體   English   中英

python龍卷風-如何返回實時數據

[英]python tornado - how to return real-time data

我在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 /

返回“一個”

第二次:

HTTP://本地主機:8888 /

返回“兩個”

第三次”

HTTP://本地主機:8888 /

閉塞

您遇到的問題是,調用IOLoop.current()。start()會將控制權轉移到Tornado。 循環直到調用IOLoop.stop()

如果需要在IOLoop啟動后執行某些操作,則可以使用其中一個回調。 例如,這是將您的代碼修改為使用IOLoop.call_later()的代碼。 如果您使用的是Tornado的早期版本(<4.0),也可以使用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()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM