1. Grigory Fateyev

    04.02.2010

    0 ↑
    0 ↓
    Здравствуйте!

    Никто не сталкивался в своих проектах со связкой Django+Tornado для "живых" сервисов, т.е. "долгоиграющих" процессов? Меня интересует как сложно это всё описать и настроить. Например "живой" блог ...

    P.S. При описании заказа, заказчик спрашивает, мол с Tornado знаком? Я, конечно, у меня пару проектов на нём крутиться (а он у меня всего лишь в качестве WSGI сервера). А тут оказалось всё немного сложнее. :)
  2. Никто не сталкивался в своих проектах со связкой Django+Tornado для "живых" сервисов, т.е. "долгоиграющих" процессов? Меня интересует как сложно это всё описать и настроить. Например "живой" блог ...

    Если Tornado это контейнер для Django процесса, то для такой задачи оно абсолютно бесполезно. Т.е. в этом случае можно выкинуть Tornado и получить тот же эффект — обработка одного пользователя на инстанс.

    Если же Tornado стоит сбоку и обрабатывает только долгоживущие запросы и своими правильными средствами (асинхронными) ходит в хранилище и как-то ещё взаимодействует с системой, тот тут игра стоит свеч.

  3. Grigory Fateyev

    04.02.2010

    0 ↑
    0 ↓
    Если Tornado это контейнер для Django процесса, то для такой задачи оно абсолютно бесполезно. Т.е. в этом случае можно выкинуть Tornado и получить тот же эффект — обработка одного пользователя на инстанс.
    Этот подход, я как раз, использую давно и успешно. Тут никакой магии нет (см. PS в первом посту).
    Если же Tornado стоит сбоку и обрабатывает только долгоживущие запросы и своими правильными средствами (асинхронными) ходит в хранилище и как-то ещё взаимодейстует с системой, тот тут игра стоит свеч.
    А вот этот механизм мне как раз и интересен. Вот нашёл интересную статью на эту тему. Сама логика такова что, как пользователь открыл ссылку в браузере, устанавливается соединение с сервером и ждёт обновления событий. А настоящий пример работы этой технологии можно посмотреть на сайте ChessVegas.
  4. А вот этот механизм мне как раз и интересен. Вот нашёл интересную статью на эту тему.

    Только он к Tornado+Django не относится.

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

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

    Теоретически возможно применение гринлетов и с Tornado, но это уже совсем странное решение.

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

    Отсюда следует вопрос, чего же вы действительно хотите?:-)

  5. Grigory Fateyev

    05.02.2010

    0 ↑
    0 ↓
    Отсюда следует вопрос, чего же вы действительно хотите?:-)
    Мне стоит задача написать "живой" блог, где бэкендом должен быть django.
  6. ziro-on-ya

    05.02.2010

    2 ↑
    0 ↓
    Мне стоит задача написать "живой" блог, где бэкендом должен быть django.
    ПМСМ если речь идет именно о "живом" блоге, то там сам Бог велел в качестве бэкэнда использовать торнадо, он именно под эти цели и заточен. А вот Джанга, как написал выше Александр, нет.

    Может быть для Джанги имеет смысл отвести другую роль - например использовать только ORM+админку.

    Ведь по существу tornado это ORM-agnostic система и с ним народ успешно использует SA например. И в принципе ничего не мешает использовать Django ORM. Для этого в принципе достаточно правильно настроить джанговское окружение при старте сервера. А самый простой способ сделать это - использовать manage.py команду по типу runserver, только надо запускать не flup а торнадо. Ну и соотвественно внутри команды у Вас будет доступен весь ORM, которые Вы с успехом можете использовать.

    Что касается админки, то в принципе никто Вам не мешает вешать джанговское приложение на другой порт, например 8080, на котором одну админку и оставить.

    Если нужно что-то еще использовать - то в принципе тоже можно подумать, хотя, мне например не кажется, что в торнадо имеет смысл менять шаблонную систему - она там гораздо шустрее чем джанговская. Да и хэндлеры в общем то тоже вполне симпатичные, хотя и несут на себе тяжелую карму Google'а.
  7. Grigory Fateyev

    05.02.2010

    0 ↑
    0 ↓
    ziro-on-ya, спасибо Вам за наводку. Буду копать в этом направлении.
  8. avl23.ya.ru

    05.02.2010

    2 ↑
    0 ↓
    ziro-on-ya +1

    Для так называемых "живых" проектов лучше действительно делать все на голом tornado
    В нем не хватает только ORM и джанговской админки. (шаблоны, url диспетчер и прочее присутствуют)
    Если хочется быстрой админки, то лучше поднять рядом admin.project.com на чистом django
    которые будут использовать ту же базу.

    Сейчас в стадии тестирования пример относительно развесистого приложения на tornado
    http://trellis-club.com ("живой" преферанс)

    Исходники присутствуют на траке http://trac.trellis-club.com
    Можно подглядеть как обходятся типичные подводные камни вроде ограничения на количество
    асинхронных запросов у браузеров и прочее.
  9. Ivan Sagalaev

    05.02.2010

    0 ↑
    0 ↓

    Хочу заметить, что ничто не мешает использовать под Tornado джанговские фишки. Надо всего лишь проинициализировать сеттинги и дальше from myapp.models import MyModel — и вперёд. Главное, долгих запросов не делать, понимая, что вы работаете под однопоточным сервером.

  10. Grigory Fateyev

    05.02.2010

    0 ↑
    0 ↓
    Спасибо Вам большое за ответы, всё оказывается не так мрачно как казалось в начале. Вполне реализуемая задача.

Внимание! Это довольно старый топик, посты в него не попадут в новые, и их никто не увидит. Пишите пост, если хотите просто дополнить топик, а чтобы задать новый вопрос — начните новый.