Python中的基本彗星只使用std lib

问题描述:

我正在为已有的桌面应用程序开发web界面。我一直在寻找一种方法来允许服务器将内容推送到浏览器并最终到达Comet。Python中的基本彗星只使用std lib

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

没有太深入的了解,我想知道是否有机会使用像BaseHTTPServer这样的标准库模块来实现Comet-like通信,并且尽可能简单,因为我不需要那么多力量和效率。

注:Jython是一种可能性,但我希望尽可能少地满足要求。

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

+0

够好。谢谢! – Santi 2009-10-05 18:01:51

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

扩展了lost-theory的说法,如果你想在客户端之间传递消息使用彗星,那么你需要实现类似pubsub的东西。

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