Как реализовать серверную часть Comet с Python?

Однажды я попытался реализовать Comet на PHP. Вскоре я обнаружил, что PHP не подходит для Comet, поскольку каждый HTTP-запрос занимает один процесс / поток. В результате он плохо масштабируется.

Я только что установил mod_python в свой XAMPP. Я думал, что Comet будет легко реализовать с помощью асинхронного программирования Python. Но до сих пор не могу понять, как это реализовать.

Есть идеи, как реализовать Comet в mod_python?


person Morgan Cheng    schedule 14.03.2010    source источник
comment
Я думаю, вы хотите сказать, что Apache не подходит для кометы, а PHP не подходит для кометы   -  person algorithmicCoder    schedule 26.05.2011


Ответы (2)


Во-первых, я совсем не специалист по асинхронности, я просто однажды исследовал эту тему. IMHO, если вы используете 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 - в котором выборка является обычной частью обработчика запросов, который, конечно, блокируется до тех пор, пока он не будет завершен - поэтому то, чем вы заканчиваете, является замороженным потоком или процессом.

Еще одна известная библиотека для выполнения неблокирующих сервисов в Python - Twisted, но я мало о ней знаю, только то, что он также может помочь вам в обработке большого количества соединений только с одним потоком / процессом.

person Tomasz Zieliński    schedule 14.03.2010
comment
Спасибо за ваш ответ. Просто хочу подтвердить. Верно ли, что Apache прикрепляет один поток / процесс для каждого HTTP-запроса? - person Morgan Cheng; 14.03.2010
comment
Да, насколько я знаю (давний пользователь mod_wsgi + Django), это правильно. - person Tomasz Zieliński; 14.03.2010

Я не уверен, сталкивались ли вы с этим вопросом, но заданный вопрос очень похож и кажется чтобы там были хорошие ответы. HTH.

person hora    schedule 14.03.2010