Найти - Пользователи
Полная версия: Как запускать Twisted-сервер из Python-приложения
Начало » Network » Как запускать Twisted-сервер из Python-приложения
1 2
PyCraft
Андрей Светлов
По поводу интерфейса - интересовал не сетевой протокол, а программный API этих взаимоменяемых модулей.
Не знаю. я пока не думал об API, полагая что это как-то не сложно реализуется. API наверное не для модулей, а для ядра.
Буду признателен за идеи.

А что насчет опосредованного запуска через twistd? Криво как-то. Это можно обойти?
PyCraft
bw
p.s. Как вариант, предусмотри в своем интерфейсе возможность интеграции главного цикла (если его нет, попробуй сделать) своего приложения и сетевого модуля (Twisted, в данном случае). Такой вариант использования Twisted был бы предпочтительнее. Twisted предоставляет механизмы такой интеграции, но кодить все же придется. В том числе по этой причине существует несколько реализаций реактора, но все они крутят цикл, это условие обязательное.
А можно поподробнее про этот вариант и механизмы Twisted?
bw
Андрей Светлов, я подобными экспериментами не занимался, так что да, такая неприятность может иметь место быть. Как вариант написать свою реализацию реактора (который будет работать в потоке), это не должно быть очень сложно, 2-3 часа на глаз.

PyCraft:
http://twistedmatrix.com/projects/core/documentation/howto/choosing-reactor.html
http://twistedmatrix.com/documents/current/api/twisted.internet.base.ReactorBase.html
http://twistedmatrix.com/documents/current/api/twisted.internet.gtk2reactor.html
и т.д.

Изучай исходники, документации нет. Смотри “примеры” - gtk2reactor, wxreactor и т.д.

..bw
PyCraft
Андрей Светлов
мои попытки завести в отдельном потоке натыкались на невозможность подвесить сигнал (signal.signal(signal.SIGINT, handler)) из потока, отличного от главного. Поэтому и танцы с бубном.
В документации не рекомендуется использовать сигналы для связи между потоками, вместо них рекомендуется использовать блокировки.
Там написано, что сигналы нужно использовать только в главном потоке.
Так что Twisted тут в общем то не при чем.
Должен быть другой путь для интеграции.
Может быть просто ссылки на функции передавать, как параметры?
Андрей Светлов
Сигналы пытался навесить именно реактор, а не я. Впрочем, bw прав - можно написать и свою реализацию реактора, если очень хочется. Правда, я бы оценил время как несколько превышающее два-три часа :) Но в любом случае не очень долго
PyCraft
Андрей Светлов
Сигналы пытался навесить именно реактор, а не я.
Тогда это приговор твистеду. С бубном я плясать не стану и заново переписывать его не готов.
Проще что-нибудь попроще использовать и самому нужную инфраструктуру создать.

Вот сейчас проверил аналогичную задачу на обычных ссылках на функции. Потребовалось всего то объявить их global и никаких проблем вызова из потока. Почему такие проблемы у сигналов, ведь смысл примерно похожий?

Если бы можно было сигнал подвешивать до создания потока… Например, я сначала инициализирую все ссылки на функции “ядра” в импортируемом модуле, а затем запускаю его стартовую функцию в потоке, который вызывает по глобальной ссылке функции “ядра” и передает ядру ссылки на свои функции, которые запускаются в уже в главном потоке. Аналогично, через глобальные списки можно реализовать “сигналы” для потока, который просматривает спсок и выполняет функции из этого списка.
Андрей Светлов
Похоже, ты хочешь использовать его немного не так, как предполагали создатели.
Я при надлежащем использовании проблем не испытывал. Как для клиента, так и для сервера.

Глобальные функции и списки - это, конечно, хорошо. Twisted гораздо гибче и ничего подобного его deferred я еще не видел.
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