Найти - Пользователи
Полная версия: Реалтайм отображение через Вебсокеты.
Начало » Python для экспертов » Реалтайм отображение через Вебсокеты.
1 2
plusplus
Пользователь нажимает кнопочку на сайте, запускается длительная операция, лог которой реалтайм отображается у него в браузере.
Как такое проще всего организовать? Пробовал через торнадо, но, так как операция всё равно блокирующая, другому пользователю приходилось ждать пока закончит работать предыдущий.
ziro
Правильнее всего разделить рабочий процесс и процесс торнадо, по которому слушается вебсокет. Взаимодействие между рабочим процессом и торнадо надо будет сделать через какую либо службу сообщений. Самый простой вариант - использовать PyZmq, который умеет дружить с торнадо -через eventloop.
reclosedev
Есть вот такое http://habrahabr.ru/post/147525/ с RabbitMQ.
plusplus
Спасибо, попробую разобраться. А вообще, что дает асинхронность торнадо? Просто я раньше думал, она поможет решить мне мою задачу, а теперь я не понимаю какая от неё вообще польза)
o7412369815963
ziro
Взаимодействие между рабочим процессом и торнадо надо будет сделать через какую либо службу сообщений.
А так же можно просто асинхронно читать вывод рабочего процесса пример

plusplus
что дает асинхронность торнадо
“Одновременное” выполнение кода в одном потоке, в отличие от многопоточных фреймфорков где на каждое подключение нужен отдельный поток. Если взглянуть на простой чат через веб-сокеты, при подключении 100к клиентов торнадо может обойтись одним потоком, для многопоточного фреймфорка придется открыть 100к потоков, а это будет неоправданный расход памяти и cpu. В общем случае асинхронные фреймворки применяют там где есть долгие подключения клиентов к серверу. Типа того…
ziro
а теперь я не понимаю какая от неё вообще польза)

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

Если же задержка доставки сообщений, например на 10-20 секунд (это бывает как правило, при общей длительности рабочего процесса более 1 минуты - чтобы можно было 3-4 “тика” сделать), не принципиальна, то использование торнадо в принципе overengeneering. Проще выгрузку лога через тупой pooling организовать, ну а общение веб-сервера и рабочего процесса через тот же RabbitMQ сделать.
slav0nic
через SSE проще сделать, чем через сокеты, темболее обмен данными однонаправленный
вообще код показал бы, в том же twisted с асинхронным запуском процессов пробелм нет
plusplus
slav0nic
через SSE проще сделать, чем через сокеты, темболее обмен данными однонаправленный
Это оно https://github.com/niwibe/sse?

slav0nic
вообще код показал бы, в том же twisted с асинхронным запуском процессов пробелм нет

Да, собственно, показывать то нечего:
class CountersSocket(tornado.websocket.WebSocketHandler):
    def on_message(self, message):
        # эта операция долго выполняется
        self.setup(message)
slav0nic
торнадо не юзаю, в твистед это делает через потоки, впроччем как и везде)
попробуй как тут сделать http://lbolla.info/blog/2013/01/22/blocking-tornado , если методы описанные выше не устраивают

plusplus
Это оно https://github.com/niwibe/sse?

оно, SSE это стандарт, а не библотека, я выбрал реализацию на twisted
Хотя в твоём случае наверно и банального comet хватит, вебсокеты имхо перебор
plusplus
slav0nic
торнадо не юзаю, в твистед это делает через потоки, впроччем как и везде)
попробуй как тут сделать http://lbolla.info/blog/2013/01/22/blocking-tornado , если методы описанные выше не устраивают
Спасибо, посмотрю. Вообще мне уже дали ссылку с реализацией на торнадо через процессы, я пока через них сделал, но потоки тоже интересны.

slav0nic
оно, SSE это стандарт, а не библотека, я выбрал реализацию на twisted
Хотя в твоём случае наверно и банального comet хватит, вебсокеты имхо перебор

А что можно почитать на эту тему, не дашь ссылок? Просто вопросов много возникает: если не сокеты то как это будет выглядеть? надо будет отдельный сервер запускать? comet этот тоже так просто не гуглится, что это?)
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB