python - 调用 Tornado 服务器时保持 ajax 调用处于事件状态

标签 python comet nonblocking tornado

我正在尝试编写我的第一个 Tornado 应用程序。
Tornado 的示例示例显示了以下代码,但是似乎一旦“MainHandler”函数返回,客户端与该服务器之间的连接就会丢失。

我希望服务器在数据可用时持续推送数据。
如何保持这一管道畅通?

在客户端,我正在考虑进行 ajax 调用。这行得通吗?
我以为一旦收到数据,ajax调用就结束了。

Facebook 确实说客户端使用 Tornado 与服务器保持一个线程打开状态,因此我知道这是可以做到的,我想我在这里正在努力解决一些简单的概念..

import tornado.ioloop  
import tornado.web  
import time

class MainHandler(tornado.web.RequestHandler):  
    def get(self):  
        self.write("What happens after this call ?")  
    # while(True): time.sleep(5) <push more data># This would be ugly.. plus blocking(correct ?) 

application = tornado.web.Application([  
    (r"/", MainHandler),  
])

if __name__ == "__main__":    
    application.listen(8888)  
    tornado.ioloop.IOLoop.instance().start()  

我的理解中缺少什么?

最佳答案

如果您想保持连接打开,您可能需要使用 websocket。像这样的东西:

LISTENERS = []

class RealtimeHandler(tornado.websocket.WebSocketHandler):
    def open(self):
        LISTENERS.append(self)

    def on_close(self):
        LISTENERS.remove(self)

application = tornado.web.Application([
    (r'/', RealtimeHandler),
])

关于python - 调用 Tornado 服务器时保持 ajax 调用处于事件状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5902684/

相关文章:

java - 如何避免阻塞 Java ServerSocket?

python - 在文本文件中打印字符百分比

php - 如何在很长一段时间内向浏览器增量显示 HTML?

php - Twitter 如何实时更新其博客文章?

linux - 打开命名管道进行写入,并在 select() 中使用

c - 主从非阻塞监听器

python - LDA Gensim Word -> 主题 ID 分布而不是主题 -> 单词分布

python - Groupby 大于 Pandas 非常慢

Python - 计数符号变化

ajax - 它在 GWT 中调用了什么来使 2 个 UI 保持一致?