Торнадо - Как реализовать клиент с длинным опросом

Я пытаюсь реализовать в Tornado клиента с длительной загрузкой, который взаимодействует с асинхронным сервером Tornado.

Происходит одно из двух:

  1. Либо тайм-аут клиента, либо
  2. Клиент получает сразу все сообщения после завершения всего фонового процесса, аналогично блокирующим.

Это клиент, который я использую:

from tornado import ioloop
from tornado import httpclient

print "\nNon-Blocking AsyncHTTPClient"
import tornado.ioloop

def async_call(response):
        if response.error:
                response.rethrow()
        print "AsyncHTTPClient Response"
        ioloop.IOLoop.instance().stop()

http_client = httpclient.AsyncHTTPClient()
http_client.fetch("http://localhost:9999/text/", async_call)
ioloop.IOLoop.instance().start()

Это правильный способ написать клиент с длинным опросом / кометой?

Я также был бы признателен тем, кто ответит, чтобы предоставить образец асинхронного сервера в Tornado, потому что, возможно, я неправильно пишу сервер Cometed Tornado ... Я немного новичок во всем процессе длительного опроса в целом.


person securecurve    schedule 24.12.2012    source источник


Ответы (1)


Сам Tornado имеет отличный пример чата, построенного на механизме длительного опроса.

https://github.com/facebook/tornado/tree/master/demos/chat

Это очень помогло мне разобраться во всем, и у него есть и сервер, и клиент.

person cleg    schedule 24.12.2012
comment
Спасибо за ваш ответ. В приведенном вами примере реализована только на стороне сервера с Tornado, а на стороне клиента - на javascript. Я хочу, чтобы клиент был написан на Tornado, а не на javascript, который соответствует реализациям сервера long-polling / comet. - person securecurve; 24.12.2012
comment
Клиент будет настольным приложением. - person securecurve; 24.12.2012
comment
Что ж, асинхронный опрос от Tornado тоже довольно прост. Просто используйте AsyncHTTPRequest Tornado в IOLoop. Я вырезал пример из своего проекта: gist.github.com/4370563 - person cleg; 25.12.2012
comment
но где находится та часть этого клиента, где он ожидает, что параметры будут отправлены с сервера без запроса, кроме самого первого запроса. Вдобавок, когда эта функция вызывается: def async_request(self, callback, server_url, method=u'GET', body=None, **kwargs): А что такое параметры обратного вызова и кто их устанавливает? - person securecurve; 25.12.2012
comment
Я сравниваю асинхронные запросы на получение и публикацию, где они вызываются напрямую, когда есть запрос на получение или отправку от клиентов к серверам, поэтому я задаю вышеуказанный вопрос. - person securecurve; 25.12.2012
comment
Это просто часть запроса. Когда данных нет - этот запрос будет ждать данных, а если есть данные - получит их и снова. Над этой функцией нужно написать какой-то цикл, повторяющий запросы и, если есть данные - их обработку. - person cleg; 25.12.2012
comment
Ты имеешь в виду инструмент для надстройки ioloop в торнадо, Клег? - person securecurve; 25.12.2012
comment
Да, если вы хотите работать асинхронно, вам нужно добавить его в IOLoop торнадо. - person cleg; 25.12.2012
comment
Я думаю, вам стоит посмотреть общий учебник по асинхронному программированию, чтобы понять, как он работает, что такое обратный вызов и т. Д. golubenco.org/2009/09/19/ это довольно хорошее руководство, но в Google их больше. Вы также можете посмотреть некоторые асинхронные уроки, отличные от Python. - person cleg; 31.12.2012
comment
Я очень ценю твою помощь, мой друг. Я уже начал это делать и, в частности, ссылку, которую вы передали, я также рассмотрю другие ваши советы и вашу помощь :)). В конце концов, я могу сказать ... С Рождеством !! Желаю всем удачи !! - person securecurve; 01.01.2013
comment
Просто чтобы вы знали, мой друг, я также начал изучать Websockets, что является действительно лучшей альтернативой, чем длинный опрос http. - person securecurve; 01.01.2013
comment
Спасибо! С Рождеством и Новым годом вас тоже! P.S. Веб-сокеты - тоже хорошая идея. - person cleg; 01.01.2013