代码之家  ›  专栏  ›  技术社区  ›  Santi

使用std lib的python中的基本Comet

  •  1
  • Santi  · 技术社区  · 15 年前

    我正在为一个已经存在的桌面应用程序开发一个Web界面。我一直在寻找一种允许服务器将内容推送到浏览器的方法,最终到达了Comet。

    通过互联网导航,这里的大多数问题,我得到了扭曲、轨道、龙卷风等答案,其中大多数甚至指向JETY或StreamHub等Java应用程序。

    我想知道,在不深入研究的情况下,是否有机会只使用basehttpserver之类的标准lib模块实现类似Comet的通信,并尽可能保持简单,因为我不需要太多的电源和效率。

    注意:Jython是一种可能性,但我希望尽可能少地使用它。

    3 回复  |  直到 15 年前
        1
  •  4
  •   Steven Kryskalla    15 年前

    正如GS所说,保持连接打开。

    下面是一个示例wsgi应用程序,每秒向客户端发送当前时间:

    import time
    
    def application(environ, start_response):
        start_response('200 OK', [('content-type', 'text/plain')])
        while True:
            time.sleep(1.0)
            yield time.ctime() + '\n'
    
    if __name__ == '__main__':
        from wsgiref.simple_server import make_server
        print "Serving on http://localhost:4000..."
        make_server('localhost', 4000, application).serve_forever()
    

    如果我转到浏览器中的URL,我会看到:

    Mon Oct 05 12:21:26 2009
    Mon Oct 05 12:21:27 2009
    Mon Oct 05 12:21:28 2009
    Mon Oct 05 12:21:29 2009
    Mon Oct 05 12:21:30 2009
    (...a new line appears every second...)
    

    这种方法的问题在于,您不能同时保持许多这样的连接处于打开状态。事实上, wsgiref 服务器是单线程的,所以您在任何时候只能打开一个连接。如果这是一个问题,那么您必须使用多线程(如Cherrypy)或非阻塞服务器(如Twisted、Tornado等)。

        2
  •  0
  •   Georg Schölly Crazy Developer    15 年前

    这是可能的。只是不要关闭与客户机的连接。

        3
  •  0
  •   user213251    15 年前

    扩展Lost理论所说的,如果您想使用Comet在客户机之间传递消息,那么您需要实现pubsub之类的东西。

    对pubsub使用类似tornado的方法要比单线程wsgiref服务器简单得多。