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

2 投票
2 回答
4764 浏览
提问于 2025-04-15 20:24

我曾经尝试在PHP中实现Comet技术。很快,我发现PHP并不适合做Comet,因为每个HTTP请求都会占用一个进程或线程。这导致它的扩展性很差,也就是说,当用户增多时,处理能力跟不上。

我刚在我的XAMPP中安装了mod_python。我以为用Python的异步编程来实现Comet会很简单。但我还是不知道该怎么做。

有没有人知道如何在mod_python中实现Comet呢?

2 个回答

0

我不确定你有没有看到这个问题,不过这个问题问的内容和你提的很相似,那里似乎有一些不错的回答。希望对你有帮助。

8

首先,我并不是异步编程的专家,只是稍微研究过这个话题。 在我看来,如果你使用XAMPP的话,就失去了进行长轮询的可能性,因为Apache会为每个请求使用线程或进程(这取决于配置)。

你需要的是一个非阻塞的网络服务器,比如Tornado,它可以把请求分成两部分,第二部分会在某个事件发生时被触发,而在此期间,服务器可以接受后续的请求。

以下是来自Tornado文档的示例 /许可/:

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下是不可行的,因为在Apache中,获取数据是请求处理程序的常规部分,这当然会阻塞,直到完成为止。所以你最终会得到一个冻结的线程或进程。

另一个著名的用于在Python中实现非阻塞服务的库是Twisted,不过我对它了解不多,只知道它也能帮助你用一个线程或进程处理很多连接。

撰写回答