gpt4 book ai didi

python Tornado - 如何返回实时数据

转载 作者:行者123 更新时间:2023-12-01 04:45:09 26 4
gpt4 key购买 nike

我正在Python中使用tornado库。我有一个队列,其中添加了数据。我必须保持连接打开,以便当客户端请求时我从队列中发送项目。这是我的一个简单实现。我面临的问题是,当我向队列添加新元素时,我看不到它被返回。事实上,我没有看到 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://localhost:8888/

返回“二”

第三次”

http://localhost:8888/

阻止

最佳答案

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

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

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 - 如何返回实时数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29615302/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com