python龙卷风-如何return实时数据
python tornado - how to return real-time data
我在 python 中使用 tornado 库。我有一个队列,其中添加了数据。我必须保持连接打开,以便在客户端请求时从队列中发送项目。这是我的一个简单实现。我面临的问题是当我向 queue
添加新元素时,我没有看到它被 returned。事实上,我没有看到 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/
returns "one"
第二次:
return "two"
第三次了
阻塞
您遇到的问题是调用 IOLoop.current().start() 将控制权转移给 Tornado。它循环直到 IOLoop.stop() 被调用。
如果您需要在 IOLoop 启动后执行某些操作,则可以使用回调之一。例如,如果您使用的是早期 (<4.0) 版本的 Tornado,那么您的代码已修改为使用 IOLoop.call_later(). You could also use 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()
我在 python 中使用 tornado 库。我有一个队列,其中添加了数据。我必须保持连接打开,以便在客户端请求时从队列中发送项目。这是我的一个简单实现。我面临的问题是当我向 queue
添加新元素时,我没有看到它被 returned。事实上,我没有看到 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/
returns "one"
第二次:
return "two"
第三次了
阻塞
您遇到的问题是调用 IOLoop.current().start() 将控制权转移给 Tornado。它循环直到 IOLoop.stop() 被调用。
如果您需要在 IOLoop 启动后执行某些操作,则可以使用回调之一。例如,如果您使用的是早期 (<4.0) 版本的 Tornado,那么您的代码已修改为使用 IOLoop.call_later(). You could also use 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()