Twisted
Comments 18
0
Огромное спасибо за статью. Продолжайте писать. Очень интересна реализация Deferred. А вообще, в Java подобное уже реализовано?
0
Насчет Java ничего не знаю, к сожалению… Twisted, насколько я знаю, близок к тому, чтобы работать под Jython, т.е. в каком-то плане может быть доступно.

Самая большая проблема для статически типизированных языков — построение цепочки callbackов, на C++ в реализации самая большая проблема именно с этим, там жуткие шаблоны ;)
0
А вы не пробовали запускать написанное на twisted на шаред или вдс хостингах?
0
Ох, не силён я в терминологиях хостинговых )

По сути, twisted-приложение — это обычное питоновское приложение. Если есть python, есть возможность запускать процессы «в фоне» (есть шелл), есть возможность установить питоновский пакет (twisted), есть возможность забиндиться на порт и т.п., то приложение будет работать. Для этого нужен выделенный сервер или виртуальный выделенный сервер (т.е. наличие своего IP, шелла и т.п.). Рутовый доступ как таковой не нужен, если есть Python, все пакеты можно установить и в свой домашний каталог.
0
Я пытался запустить, но висло все именно на socket.bind.
Приложение автоматически биндилось на странный ип (типа 127.0.4.x) и результат отправленного запроса просто не приходил обратно в функцию, все умирало по таймауту. У сервера есть конечно внешний ИП, но на него биндиться не получилось :(

Думал, может у кого есть опыт, хотел джаббер бота запустить на хостинге :)
0
По умолчанию Twisted биндится на все интерфейсы, возможно это у него не получается, и надо ему сказать выбирать конкретный адрес (интерфейс). Ну и на всякий случай не-рутовые приложения не могут получить порт ниже 1024.
0
До этого был на freebsd там так и не смог победить проблемы с kqueue, суть в том что если я использовал потоки twisted начинал юзать обычный селект, перешел на debian там с epoll проблем нет:)
0
Там с kqueue надо было патчить порт py-kqueue, после этого счастье ;) А еще был баг в самом Twisted, но они это пофиксили в новых версиях.
0
И еще был чудесный баг, twistd не запускал процесс в фоне с --reactor=kqueue. Помогал ключик '-n' и уход в демона внешними средствами.
0
Очеь интересная идея, не слышал о ней раньше, но сразу же появляются 2 вопроса:

1) Там где есть асинхронный вызов процедур, нужен таймаут, иначе есть вероятность, что она так и не завершится, а в программе будет странный непонятный глюк. Соответственно имеет наверно смысл и ограничение общего кол-ва «отложенных» процедур.
2) Ну и поддерживать такие вещи надо на уровне компилятора и машинного кода, так как вся эта конструкция наверно несет оверхед.
0
1. Таймаут нужен там, где он может произойти, ну, например, вызов connect(). Если он завершится ошибкой, надо в цепочку Deferred запустить Failure, т.е. обычное исключение. Таймаут не отличается от разрыва соединения и т.п. Twisted это умеет.
2. Не несет существенного, она очень-очень простая. Полторы страницы кода (Python). Научиться ей пользоваться и думать в её терминах сложнее, но реализация простая и эффективная.
0
А возможно ли на Deferred сделать обработку исключений?

Например (возьмём первый рисунок), при выполнении без ошибок: callback2 выделила некоторый ресурс (который обязательно необходимо освободить), callback3 использовала этот ресурс, и callback4 его освободила. В какой errback надо установить код освобождения этого ресурса если в callback3 возникнет исключение? Напрашивающийся ответ — errback4, но в этом случае он так же будет вызван если ошибка возникнет в callback1, ещё до выделения ресурса, что неприемлемо.
0
Лучше смотреть на картинку «Deferred в квадрате», и рассматривать Deferred2 как отдельный поток, который начинается выделением ресурса (т.е. к моменту прихода на уровень callback2_1 ресурс уже выделен).

У Deferred есть метод .addBoth, который добавляет один и тот же обработчик на оба слота (callback/errback) на одном уровне. Это модель try...finally, который и используется для гарантированного освобождения ресурса при любом исходе.
0
Спасибо, очень полезно и как раз в теме на работе — разбираюсь с оптимизацией доступа к бд
Only those users with full accounts are able to leave comments., please.