Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python tornado-如何返回实时数据_Python_Websocket_Tornado - Fatal编程技术网

python tornado-如何返回实时数据

python tornado-如何返回实时数据,python,websocket,tornado,Python,Websocket,Tornado,我正在使用python中的tornado库。我有一个队列,可以在其中添加数据。我必须保持连接打开,以便当客户端请求时,我从队列中发送项目。这是我的一个简单实现。我面临的问题是,当我向队列添加新元素时,我看不到它被返回。事实上,我没有看到任何代码在下面执行IOLoop.current().start()行 from tornado.ioloop import IOLoop from tornado.web import RequestHandler, Application, url,asynch

我正在使用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()
这是第一次:

返回“一”

这是第二次:

返回“2”

这是第三次”


阻塞问题是调用IOLoop.current().start()会将控制权转移到Tornado。它会循环直到调用为止

如果您需要在IOLoop启动后执行某些操作,则可以使用其中一个回调。例如,下面是修改后要使用的代码。如果您使用的是较早的回调,也可以使用(
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()