使用std lib的Python基本Comet

时间:2009-10-05 16:04:09

标签: python comet

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

通过互联网浏览,以及大多数问题,我得到了扭曲,轨道,龙卷风等答案,其中大多数甚至指向Jetty或StreamHub等Java应用程序。

在这方面没有太深入,我想知道是否有机会使用像BaseHTTPServer这样的标准lib模块来实现类似Comet的通信,并保持尽可能简单,因为我不需要那么多的功能和效率。

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

3 个答案:

答案 0 :(得分:4)

正如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()

如果我在浏览器中找到该网址,我会看到:

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等)。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

扩展了理论所说的内容,如果你想使用彗星在客户端之间传递消息,那么你需要实现像pubsub这样的东西。

对于pubsub使用龙卷风之类的东西要比单线程wsgiref服务器简单得多。