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

Mor*_*eng 2 python comet

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

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

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

Tom*_*ski 8

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

您需要的是非阻塞Web服务器,如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()
Run Code Online (Sandbox Code Playgroud)

- 据我所知,这在Apache下是不可能的 - 其中fetch是请求处理程序的常规部分,当然它会一直阻塞直到它完成 - 所以你最终得到的是冻结的线程或进程.

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