[英]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 /
返回“一個”
第二次:
返回“兩個”
第三次”
閉塞
您遇到的問題是,調用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.