如何用Python实现Comet服务器端?

问题描述:

我曾试图在PHP中实现Comet。很快,我发现PHP不适用于Comet,因为每个HTTP请求都会占用一个进程/线程。结果,它不能很好地扩展。如何用Python实现Comet服务器端?

我刚刚在我的XAMPP中安装了mod_python。我认为用Python异步编程实现Comet会很容易。但仍然无法得知如何实施它。

是否有任何想法如何在mod_python中实现Comet?

+0

我想你的意思是说“Apache不适合彗星”而不是“PHP不适合彗星” – algorithmicCoder 2011-05-25 23:16:11

首先,我不是异步专家,我只是调查了一次这个话题。 恕我直言,如果您使用XAMPP,那么您将失去进行长轮询的可能性,因为Apache使用每个请求的线程/进程(取决于配置)。

您需要的是非阻塞网络服务器,如Tornado,它允许将请求分成两部分,其中第二部分在某些事件中被触发,但同时服务器可以接受后续入站请求。

来自实例Tornado documentation/license /:

class MainHandler(tornado.web.RequestHandler): 
    @tornado.web.asynchronous 
    def get(self): 
     http = tornado.httpclient.AsyncHTTPClient() 
     http.fetch("http://friendfeed-api.com/v2/feed/bret", 
       callback=self.async_callback(self.on_response)) 

    def on_response(self, response): 
     if response.error: raise tornado.web.HTTPError(500) 
     json = tornado.escape.json_decode(response.body) 
     self.write("Fetched " + str(len(json["entries"])) + " entries " 
        "from the FriendFeed API") 
     self.finish() 

- 因为据我所知,这是不可能的Apache下 - 其中的抓取请求处理程序,这当然块,直到它的完整的规则部分 - 所以你以冻结的线程或进程结束。

另一个在Python中使用非阻塞服务的着名库是Twisted,但我对它的了解不多,只是它也能够帮助您处理大量只有一个线程/进程的连接。

+0

感谢您的回复。 只是想确认。对于每个HTTP请求,Apache是​​否坚持一个线程/进程是真的? – 2010-03-14 08:19:25

+0

是的,据我所知(长时间mod_wsgi + Django用户),这是正确的。 – 2010-03-14 13:04:32

我不确定你是否遇到过this question,但问的问题非常相似,并且似乎有一些很好的答案。 HTH。