Найти - Пользователи
Полная версия: Каркас асинхронного сервера
Начало » Python для новичков » Каркас асинхронного сервера
1 2
andrew.spb
Помогите спроектировать каркас приложения.
Уже месяц сижу, что-то не получается сделать. Читаю Лутца.
Отдельно все понятно, воедино соединить во что-то крисивое никак не выходит.
Не понимаю, как лучше это разбивать на пакеты, что использовать, процессы или потоки, как лучше организовать между ними взаимодействие. Искал примеры похожих серверов, но что-то не нашел. Одни банальные эхо серверы кругом.
Python 3

Описание будущего приложения:
Это сервер сообщений. Сообщения хранятся в СУБД. Сервер обрабатывает подключения клиентов, раздавая положенную им почту, по самодельному протоколу. Сервера сообщений будут взаимодействовать между собой (маршрутизация сообщений).
Что сейчас хочу от каркаса:
* Приложение должно работать как линукс-демон (демонизация не сложно делается, поэтому можно и без этого, если это не меняет ничего принципиального).
* Должна иметься система плагинов
* Два плагина журналирования (в файл и в СУБД). Соотвественно любой модуль, должен иметь возможность писать в этот журнал.
* Два плагина конфигурации (опции приложения из файла конфигурации или из СУБД). Аналогично, конфигурация должна быть доступна из любого места приложения.
* Просмотр и редактирование конфигурации сервера через веб-интерфейс (это на перспективу), планирую делать через HTTPServer и собственную обработку запросов.
* Должен запускаться сокет-сервер (главная часть приложения), принимать подключения (передавать ничего не нужно), просто соединения открывать/закрывать
* Формат взаимодействия с клиентами тоже хочется оформить как плагин

Только начал изучать питон, после прочтения трех книжек в голове образовалась каша из всего.
Буду рад любой помощи и советам. Может примерам.
lorien
Рекоменду урезать функционал и написать что-то простое и работающее. Затем уже добавлять требования и расширять систему (или даже с нуля переписать).

Сделайте это для начала: Это сервер сообщений. Сообщения хранятся в СУБД. Сервер обрабатывает подключения клиентов, раздавая положенную им почту, по самодельному протоколу. Сервера сообщений будут взаимодействовать между собой (маршрутизация сообщений)

Что такое плагин в вашем понимании я не знаю, но если можно, лучше от них вообще отказаться :)
andrew.spb
lorien
Рекоменду урезать функционал и написать что-то простое и работающее.
Вот это простое работающее я и назвал каркасом. Это и есть минимальный функционал.
Затем уже добавлять требования и расширять систему (или даже с нуля переписать).Сделайте это для начала: Это сервер сообщений. Сообщения хранятся в СУБД. Сервер обрабатывает подключения клиентов, раздавая положенную им почту, по самодельному протоколу. Сервера сообщений будут взаимодействовать между собой (маршрутизация сообщений)
Проблема собственно и есть не в написании отдельных модулей, а в их взаимодействии в целом.
Например, даже если начать с простого, банальная система журналирования, каким образом ее сделать?
Если в потоке (или процессе) обрабатывающем подключение, надо записать что-то в лог (“клиент подключился”).
Как это сделать? Через queue?

Что такое плагин в вашем понимании я не знаю, но если можно, лучше от них вообще отказаться
Плагин - это некий модуль, который можно положить в директорию, который будет обнаружен приложением и использован. Возможно, в питоне это и не совсем актуально (идея перекочевала из qt-проекта) и тут используется какой-то другой подход.
Пример, плагины для разных протоколов. Добавив новый плагин, сервер может работать по новому протоколу.
4kpt_II
andrew.spb
Только начал изучать питон, после прочтения трех книжек в голове образовалась каша из всего.

andrew.spb
Каркас асинхронного сервера

Эммм…

Забыл написать. Гляньте в сторону Торнадо. Там уже много чего сделано за Вас. Может подойдет?
andrew.spb
4kpt_II
Подойдет, и Twisted подойдет, и другие похожие фреймворки.
Проблема в том, что я не могу их использовать, поскольку ограничен только стандартными возможностями Python 3.2
А это сторонние пакеты, я не могу их взять, к сожалению
4kpt_II
Тогда у Вас тяжелый и тернистый путь. Асинхронка сама по себе сложна. А если пилить все с нуля, тогда вообще хардкор. Могу пожелать только удачи и выдержки.

Если бы у меня стояла такая задача. Я бы смотрел в сторону Торнадо. Как у них там все это реализовано. Тем более, что вся информация доступна и нормально отсортирована и логично упакована. И, мне кажеться, одними средствами питона это будет реализовать очень и очень сложно…
Budulianin
andrew.spb
ограничен только стандартными возможностями Python 3.2

Странное ограничение. Бери Python 3.4, там в коробке есть asyncio
andrew.spb
Budulianin
Я неспроста указал версию питона.
mgk
Без использования сторонних библиотек на python 3.2 чистый асинхронный сервер реализовать очень трудоёмко.
Как вариант, можешь реализовать псевдоасинхронный сервер, в котором цикл постановки/обработки задач функционирует также, как в асинхронном сервере, но выполнение блокирующих задач (обращение к БД, ожидание ответа по сети и т.д.) происходит в потоках.
andrew.spb
mgk
Без использования сторонних библиотек на python 3.2 чистый асинхронный сервер реализовать очень трудоёмко.
А если 2.7? А что вообще значит чистый асинхронный сервер?
mgk
Как вариант, можешь реализовать псевдоасинхронный сервер, в котором цикл постановки/обработки задач функционирует также, как в асинхронном сервере, но выполнение блокирующих задач (обращение к БД, ожидание ответа по сети и т.д.) происходит в потоках.
Вообще я так и планировал, сетевые соединения в отдельных потоках, БД тоже отдельным потоком. Связь через queue.

А вообще имеет ли смысл делать такой сервер на питоне? Может вернуться на qt?
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