Найти - Пользователи
Полная версия: Как запускать Twisted-сервер из Python-приложения
Начало » Network » Как запускать Twisted-сервер из Python-приложения
1 2
PyCraft
Как интегрировать с основным приложением - ядром(kernel.py), Twisted-TCP-сервер отвечающий только за сетевое взаимодействие?

Нужно вызвать его как модуль(TCP-сервер) из ядра и обеспечить вызовы функций в обоих направлениях.

Однако, по документации Twisted приложения запускаются опосредовано, так

twistd -n -y twisted_app.py

Желательно, в ядре вообще не иметь ничего из Twisted, а в Twisted-приложении только интерфейс к ядру и стандартный интерфейс, который известен ядру и является общим для всех модулей, подключаемых к ядру.

Или с Twisted в этом случае лучше не связываться?
bw
from twisted.internet import reactor
reactor.run()

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

p.s. Ты можешь не отдавать главный цикл Twisted (reactor.run()), а время от времени вызывать метод reactor.interate(), но это плохая идея.

..bw
PyCraft
bw
Если ты не строишь приложение на Twisted, а пытаешься последнего прикрутить к своему приложению где-то сбоку, то лучше не связываться.
не совсем сбоку, а по прямому назначению, как модуль сетевого взаимодействия. Скорее всего в будущем будут несколько альтернативных модулей, написанных разными способами, но выполняющих одинаковую задачу. Например, на Python - SocketServer, asyncore или на C/C++ для Windows, Linux, BSD, Mac.
PyCraft
bw
Twisted после этого начнет крутить главный цикл.
Скорее всего придется запустить его в потоке и пусть себе крутит, главное чтобы реагировал на вызовы со стороны ядра и мог обращаться к ядру. Наверное что-то с делегатами и интерфейсами надо намутить?
Андрей Светлов
не помогут “делегаты и интерфейсы”. Нужен главный поток, в котором запущен run. Остальное - от лукавого.
И, кстати, интересный вопрос: а какой интерфейс у “модуля сетевого взаимодействия?”.
Чтобы при этом его можно было реализовать на чем угодно - и он оставался простым и удобным.
PyCraft
Андрей Светлов
не помогут “делегаты и интерфейсы”. Нужен главный поток, в котором запущен run. Остальное - от лукавого.
А разве в дочернем потоке run() не запустится?
PyCraft
Андрей Светлов
И, кстати, интересный вопрос: а какой интерфейс у “модуля сетевого взаимодействия?”.
Вариантов много. Самый бронебойный через сокеты и с собственным протоколом, однако это на крайний случай. Меня интересует, о чем подумали разработчики.
Андрей Светлов
Чтобы запустить в дочернем - приходилось долго и изобретательно плясать с бубном. Причем я не уверен, что в конце-концов абсолютно все работало правильно.
По поводу интерфейса - интересовал не сетевой протокол, а программный API этих взаимоменяемых модулей.
bw
Вроде не должно возникнуть проблем с запуском основного цикла в отдельном потоке. Разве что все обращения к такой системе из потока отличного от “главного” (см. twisted.python.threadable.isInIOThread после запуска реактора) тебе придется выполнять с учетом синхронизации. Например используя метод reactor.callFromThread.

p.s. Как вариант, предусмотри в своем интерфейсе возможность интеграции главного цикла (если его нет, попробуй сделать) своего приложения и сетевого модуля (Twisted, в данном случае). Такой вариант использования Twisted был бы предпочтительнее. Twisted предоставляет механизмы такой интеграции, но кодить все же придется. В том числе по этой причине существует несколько реализаций реактора, но все они крутят цикл, это условие обязательное.

..bw
Андрей Светлов
мои попытки завести в отдельном потоке натыкались на невозможность подвесить сигнал (signal.signal(signal.SIGINT, handler)) из потока, отличного от главного. Поэтому и танцы с бубном.
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