【问题标题】:Basic Comet in Python using just std lib仅使用标准库的 Python 中的基本 Comet
【发布时间】:2009-10-05 16:04:08
【问题描述】:

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

浏览互联网以及这里的大多数问题,我得到了诸如扭曲、轨道、龙卷风之类的答案,其中大多数甚至指向 Java 应用程序,例如 Jetty 或 StreamHub。

无需深入探讨,我想知道是否有机会仅使用 BaseHTTPServer 之类的标准库模块来实现类似彗星的通信,并让事情尽可能简单,因为我不需要太多的权力和效率。

注意:Jython 是一种可能,但我希望以尽可能少的要求保持它。

【问题讨论】:

    标签: python comet


    【解决方案1】:

    正如 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】:

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

      【讨论】:

        【解决方案3】:

        扩展 lost-theory 所说的内容,如果您想使用 comet 在客户端之间传递消息,那么您需要实现类似 pubsub 的东西。

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-11-13
          • 1970-01-01
          • 2011-04-17
          相关资源
          最近更新 更多