Уведомления

Группа в Telegram: @pythonsu
  • Начало
  • » Network
  • » Как запускать Twisted-сервер из Python-приложения [RSS Feed]

#1 Июнь 25, 2008 14:17:33

PyCraft
От:
Зарегистрирован: 2008-05-23
Сообщения: 81
Репутация: +  0  -
Профиль   Отправить e-mail  

Как запускать Twisted-сервер из Python-приложения

Как интегрировать с основным приложением - ядром(kernel.py), Twisted-TCP-сервер отвечающий только за сетевое взаимодействие?

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

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

twistd -n -y twisted_app.py

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

Или с Twisted в этом случае лучше не связываться?



Отредактировано (Июнь 25, 2008 14:20:18)

Офлайн

#2 Июнь 25, 2008 14:55:38

bw
От:
Зарегистрирован: 2007-09-26
Сообщения: 938
Репутация: +  20  -
Профиль   Адрес электронной почты  

Как запускать Twisted-сервер из Python-приложения

from twisted.internet import reactor
reactor.run()

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

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

..bw



Отредактировано (Июнь 25, 2008 14:58:19)

Офлайн

#3 Июнь 25, 2008 14:59:37

PyCraft
От:
Зарегистрирован: 2008-05-23
Сообщения: 81
Репутация: +  0  -
Профиль   Отправить e-mail  

Как запускать Twisted-сервер из Python-приложения

bw
Если ты не строишь приложение на Twisted, а пытаешься последнего прикрутить к своему приложению где-то сбоку, то лучше не связываться.
не совсем сбоку, а по прямому назначению, как модуль сетевого взаимодействия. Скорее всего в будущем будут несколько альтернативных модулей, написанных разными способами, но выполняющих одинаковую задачу. Например, на Python - SocketServer, asyncore или на C/C++ для Windows, Linux, BSD, Mac.



Отредактировано (Июнь 25, 2008 15:14:14)

Офлайн

#4 Июнь 25, 2008 15:04:04

PyCraft
От:
Зарегистрирован: 2008-05-23
Сообщения: 81
Репутация: +  0  -
Профиль   Отправить e-mail  

Как запускать Twisted-сервер из Python-приложения

bw
Twisted после этого начнет крутить главный цикл.
Скорее всего придется запустить его в потоке и пусть себе крутит, главное чтобы реагировал на вызовы со стороны ядра и мог обращаться к ядру. Наверное что-то с делегатами и интерфейсами надо намутить?



Отредактировано (Июнь 25, 2008 15:11:09)

Офлайн

#5 Июнь 25, 2008 15:37:20

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

Как запускать Twisted-сервер из Python-приложения

не помогут “делегаты и интерфейсы”. Нужен главный поток, в котором запущен run. Остальное - от лукавого.
И, кстати, интересный вопрос: а какой интерфейс у “модуля сетевого взаимодействия?”.
Чтобы при этом его можно было реализовать на чем угодно - и он оставался простым и удобным.



Офлайн

#6 Июнь 25, 2008 15:40:03

PyCraft
От:
Зарегистрирован: 2008-05-23
Сообщения: 81
Репутация: +  0  -
Профиль   Отправить e-mail  

Как запускать Twisted-сервер из Python-приложения

Андрей Светлов
не помогут “делегаты и интерфейсы”. Нужен главный поток, в котором запущен run. Остальное - от лукавого.
А разве в дочернем потоке run() не запустится?



Офлайн

#7 Июнь 25, 2008 15:57:41

PyCraft
От:
Зарегистрирован: 2008-05-23
Сообщения: 81
Репутация: +  0  -
Профиль   Отправить e-mail  

Как запускать Twisted-сервер из Python-приложения

Андрей Светлов
И, кстати, интересный вопрос: а какой интерфейс у “модуля сетевого взаимодействия?”.
Вариантов много. Самый бронебойный через сокеты и с собственным протоколом, однако это на крайний случай. Меня интересует, о чем подумали разработчики.



Офлайн

#8 Июнь 25, 2008 17:48:23

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

Как запускать Twisted-сервер из Python-приложения

Чтобы запустить в дочернем - приходилось долго и изобретательно плясать с бубном. Причем я не уверен, что в конце-концов абсолютно все работало правильно.
По поводу интерфейса - интересовал не сетевой протокол, а программный API этих взаимоменяемых модулей.



Офлайн

#9 Июнь 25, 2008 17:57:14

bw
От:
Зарегистрирован: 2007-09-26
Сообщения: 938
Репутация: +  20  -
Профиль   Адрес электронной почты  

Как запускать Twisted-сервер из Python-приложения

Вроде не должно возникнуть проблем с запуском основного цикла в отдельном потоке. Разве что все обращения к такой системе из потока отличного от “главного” (см. twisted.python.threadable.isInIOThread после запуска реактора) тебе придется выполнять с учетом синхронизации. Например используя метод reactor.callFromThread.

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

..bw



Отредактировано (Июнь 25, 2008 18:03:46)

Офлайн

#10 Июнь 25, 2008 20:25:13

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

Как запускать Twisted-сервер из Python-приложения

мои попытки завести в отдельном потоке натыкались на невозможность подвесить сигнал (signal.signal(signal.SIGINT, handler)) из потока, отличного от главного. Поэтому и танцы с бубном.



Офлайн

  • Начало
  • » Network
  • » Как запускать Twisted-сервер из Python-приложения[RSS Feed]

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version