【问题标题】:How to implement Comet server side with Python?如何用 Python 实现 Comet 服务器端?
【发布时间】:2011-01-27 08:17:06
【问题描述】:

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

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

你知道如何在 mod_python 中实现 Comet 吗?

【问题讨论】:

  • 我想你的意思是说“Apache 不适合彗星”而不是“PHP 不适合彗星”

标签: python comet


【解决方案1】:

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

您需要的是非阻塞 Web 服务器,例如 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 下是不可能的——其中 fetch 是请求处理程序的常规部分,它当然会阻塞直到它完成——所以你结束的是冻结的线程或进程。

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

【讨论】:

  • 感谢您的回复。只是想确认一下。 Apache 是否为每个 HTTP 请求坚持一个线程/进程?
  • 是的,据我所知(长期 mod_wsgi + Django 用户)是正确的。
【解决方案2】:

我不确定您是否遇到过this question,但提出的问题非常相似,而且那里似乎有一些很好的答案。 HTH。

【讨论】:

    猜你喜欢
    • 2010-12-16
    • 1970-01-01
    • 2011-01-19
    • 2010-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-03
    • 2019-11-23
    相关资源
    最近更新 更多