Форум сайта python.su
Как интегрировать с основным приложением - ядром(kernel.py), Twisted-TCP-сервер отвечающий только за сетевое взаимодействие?
Нужно вызвать его как модуль(TCP-сервер) из ядра и обеспечить вызовы функций в обоих направлениях.
Однако, по документации Twisted приложения запускаются опосредовано, так
twistd -n -y twisted_app.py
Желательно, в ядре вообще не иметь ничего из Twisted, а в Twisted-приложении только интерфейс к ядру и стандартный интерфейс, который известен ядру и является общим для всех модулей, подключаемых к ядру.
Или с Twisted в этом случае лучше не связываться?
Отредактировано (Июнь 25, 2008 14:20:18)
Офлайн
from twisted.internet import reactor reactor.run()
Отредактировано (Июнь 25, 2008 14:58:19)
Офлайн
bwне совсем сбоку, а по прямому назначению, как модуль сетевого взаимодействия. Скорее всего в будущем будут несколько альтернативных модулей, написанных разными способами, но выполняющих одинаковую задачу. Например, на Python - SocketServer, asyncore или на C/C++ для Windows, Linux, BSD, Mac.
Если ты не строишь приложение на Twisted, а пытаешься последнего прикрутить к своему приложению где-то сбоку, то лучше не связываться.
Отредактировано (Июнь 25, 2008 15:14:14)
Офлайн
bwСкорее всего придется запустить его в потоке и пусть себе крутит, главное чтобы реагировал на вызовы со стороны ядра и мог обращаться к ядру. Наверное что-то с делегатами и интерфейсами надо намутить?
Twisted после этого начнет крутить главный цикл.
Отредактировано (Июнь 25, 2008 15:11:09)
Офлайн
не помогут “делегаты и интерфейсы”. Нужен главный поток, в котором запущен run. Остальное - от лукавого.
И, кстати, интересный вопрос: а какой интерфейс у “модуля сетевого взаимодействия?”.
Чтобы при этом его можно было реализовать на чем угодно - и он оставался простым и удобным.
Офлайн
Андрей СветловА разве в дочернем потоке run() не запустится?
не помогут “делегаты и интерфейсы”. Нужен главный поток, в котором запущен run. Остальное - от лукавого.
Офлайн
Андрей СветловВариантов много. Самый бронебойный через сокеты и с собственным протоколом, однако это на крайний случай. Меня интересует, о чем подумали разработчики.
И, кстати, интересный вопрос: а какой интерфейс у “модуля сетевого взаимодействия?”.
Офлайн
Чтобы запустить в дочернем - приходилось долго и изобретательно плясать с бубном. Причем я не уверен, что в конце-концов абсолютно все работало правильно.
По поводу интерфейса - интересовал не сетевой протокол, а программный API этих взаимоменяемых модулей.
Офлайн
Вроде не должно возникнуть проблем с запуском основного цикла в отдельном потоке. Разве что все обращения к такой системе из потока отличного от “главного” (см. twisted.python.threadable.isInIOThread после запуска реактора) тебе придется выполнять с учетом синхронизации. Например используя метод reactor.callFromThread.
p.s. Как вариант, предусмотри в своем интерфейсе возможность интеграции главного цикла (если его нет, попробуй сделать) своего приложения и сетевого модуля (Twisted, в данном случае). Такой вариант использования Twisted был бы предпочтительнее. Twisted предоставляет механизмы такой интеграции, но кодить все же придется. В том числе по этой причине существует несколько реализаций реактора, но все они крутят цикл, это условие обязательное.
..bw
Отредактировано (Июнь 25, 2008 18:03:46)
Офлайн
мои попытки завести в отдельном потоке натыкались на невозможность подвесить сигнал (signal.signal(signal.SIGINT, handler)) из потока, отличного от главного. Поэтому и танцы с бубном.
Офлайн