Базовая Comet в Python, использующая только стандартную библиотеку lib - PullRequest
1 голос
/ 05 октября 2009

Я разрабатываю веб-интерфейс для уже существующего настольного приложения. Я искал способ, позволяющий серверу передавать содержимое в браузер, и в итоге достиг Comet.

Навигация по Интернету и большинство вопросов здесь, я получил ответы, такие как витая, орбитальная, торнадо, и большинство из них даже указывают на Java-приложения, такие как Jetty или StreamHub.

Не вдаваясь в это слишком глубоко, я хотел бы знать, есть ли шанс реализовать кометоподобную коммуникацию, используя только стандартные модули lib, такие как BaseHTTPServer, и сделать все как можно проще, поскольку мне не нужно много энергии и эффективность.

Примечание: возможен Jython, но я бы хотел, чтобы к нему предъявлялись как можно меньшие требования.

Ответы [ 3 ]

4 голосов
/ 05 октября 2009

Как сказал gs, просто держите соединение открытым.

Вот пример приложения WSGI, которое каждую секунду отправляет текущее время клиенту:

import time

def application(environ, start_response):
    start_response('200 OK', [('content-type', 'text/plain')])
    while True:
        time.sleep(1.0)
        yield time.ctime() + '\n'

if __name__ == '__main__':
    from wsgiref.simple_server import make_server
    print "Serving on http://localhost:4000..."
    make_server('localhost', 4000, application).serve_forever()

Если перейти по URL-адресу в браузере, я вижу следующее:

Mon Oct 05 12:21:26 2009
Mon Oct 05 12:21:27 2009
Mon Oct 05 12:21:28 2009
Mon Oct 05 12:21:29 2009
Mon Oct 05 12:21:30 2009
(...a new line appears every second...)

Проблема с этим подходом состоит в том, что вы не можете держать очень много открытых соединений одновременно открытыми. Фактически, сервер wsgiref является однопоточным, поэтому в любое время можно открыть только одно соединение. Если это проблема, вы должны использовать многопоточный (например, CherryPy) или неблокирующий сервер (например, Twisted, Tornado и т. Д.).

0 голосов
/ 17 ноября 2009

Расширяя сказанное в теории утраты, если вы хотите использовать комету для передачи сообщений между клиентами, вам нужно реализовать что-то вроде pubsub.

Использовать что-то вроде торнадо для pubsub гораздо проще, чем с однопоточными серверами wsgiref.

0 голосов
/ 05 октября 2009

Это возможно. Только не закрывайте соединение с клиентом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...