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

时间:2010-03-14 07:48:51

标签: python comet

我曾尝试用PHP实现Comet。很快,我发现PHP不适合Comet,因为每个HTTP请求都会占用一个进程/线程。结果,它不能很好地扩展。

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

有没有想过如何在mod_python中实现Comet?

2 个答案:

答案 0 :(得分:8)

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

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

来自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下是不可能的 - 其中fetch是请求处理程序的常规部分,当然它会一直阻塞直到它完成 - 所以你最终得到的是冻结的线程或进程。

另一个在Python中进行非阻塞服务的着名库是Twisted,但我不太了解它,只是它能够帮助你只用一个线程来处理很多连接/处理

答案 1 :(得分:0)

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