Как сделать так, чтобы мой вечный кадр не закрывал мне соединение? - PullRequest
0 голосов
/ 02 июня 2011

Итак, я использую фрейм-фрейм для потоковой передачи данных из Tornado в клиентское приложение JavaScript, и я обнаружил, что случайный клиент JavaScript просто прекращает получать данные. Я реализовал метод heartbeat, в котором клиент будет изменять URL-адрес фрейма, чтобы повторно открывать соединение, когда пропускается heartbeat, но это похоже на неловкий взлом - и есть определенное количество настроек и разрывов, которые должны произойдет в пользовательском интерфейсе приложения при обновлении соединения. Я действительно предпочел бы, чтобы это было одно постоянное соединение для всего сеанса использования.

Иногда это происходит раз в несколько минут, в других случаях кажется, что это происходит в цикле, где это происходит каждые пять секунд. Мои браузеры - Firefox и Chrome.

Какие вещи могут вызвать эту проблему? Мне просто нужны некоторые идеи для начальных точек в моей отладке - стоит ли мне смотреть на задержку, переполнение данных, плохое соединение? Будет ли проблема более вероятной в конце Торнадо или в конце JavaScript? В качестве альтернативы, лучше ли мне вкладывать свои усилия в то, чтобы приложение JavaScript могло более изящно реинициализироваться?

1 Ответ

0 голосов
/ 29 июня 2011

Aha. Я понял это. Торнадо плохо справляется с параллелизмом . Проблема заключалась в том, что моя логика вызывала долгоживущие экземпляры RequestHandler из нескольких потоков (вызванных входящими RPC), и когда они сталкивались, Tornado выходил из строя и закрывал соединение.

Исправление состояло в том, чтобы поставить в очередь мои взаимодействия с экземплярами RequestHandler в потоке IOLoop, используя add_callback:

tornado.ioloop.IOLoop.instance (). Add_callback (do_stuff)

...