如何用Python实现Comet服务器端?
我曾经尝试在PHP中实现Comet技术。很快,我发现PHP并不适合做Comet,因为每个HTTP请求都会占用一个进程或线程。这导致它的扩展性很差,也就是说,当用户增多时,处理能力跟不上。
我刚在我的XAMPP中安装了mod_python。我以为用Python的异步编程来实现Comet会很简单。但我还是不知道该怎么做。
有没有人知道如何在mod_python中实现Comet呢?
2 个回答
0
我不确定你有没有看到这个问题,不过这个问题问的内容和你提的很相似,那里似乎有一些不错的回答。希望对你有帮助。
8
首先,我并不是异步编程的专家,只是稍微研究过这个话题。 在我看来,如果你使用XAMPP的话,就失去了进行长轮询的可能性,因为Apache会为每个请求使用线程或进程(这取决于配置)。
你需要的是一个非阻塞的网络服务器,比如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,不过我对它了解不多,只知道它也能帮助你用一个线程或进程处理很多连接。