使用标准库在Python中实现基本的Comet
我正在为一个已经存在的桌面应用程序开发一个网页界面。我在寻找一种方法,让服务器能够主动把内容推送到浏览器,最后我找到了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等)。