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