使用标准库在Python中实现基本的Comet

1 投票
3 回答
745 浏览
提问于 2025-04-15 14:49

我正在为一个已经存在的桌面应用程序开发一个网页界面。我在寻找一种方法,让服务器能够主动把内容推送到浏览器,最后我找到了Comet技术。

在网上浏览时,我看到很多问题的回答提到了像twisted、orbited、tornado这样的东西,还有很多人提到Java应用程序,比如Jetty或StreamHub。

不过,我不想深入探讨这些。我想知道是否有可能仅使用标准库模块,比如BaseHTTPServer,来实现类似Comet的通信,这样可以尽量保持简单,因为我并不需要太强大的功能和效率。

备注:Jython是一个选择,但我希望尽量减少需求。

3 个回答

0

接着lost-theory说的,如果你想用comet在客户端之间传递消息,那么你需要实现类似于发布-订阅(pubsub)这样的机制。

使用像tornado这样的工具来实现发布-订阅会比用单线程的wsgiref服务器简单得多。

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

撰写回答