Форум сайта python.su
Здравствуйте,
Есть некое консольное приложение реализующее сервер на основе asyncore и asynchat. Сейчас появилась идея прикрутить к этому делу графическую оболочку на PySide (PyQt), которая будет осуществлять управление сервером и отображение статус соединений.
Собственно вопрос - как правильно осуществить это объединение, чтобы части не мешали друг другу. То есть, например, не происходило блокировок интерфейса и/или соединений. Стоит ли этого бояться?
Как я предполагаю - главный поток создает дополнительный поток (или лучше процесс из multiprocessing?) с помощью threading. Далее главный поток занимается обработкой сообщений окон PyQt. Дополнительный поток занимается только asyncore.loop(). В классах обрабатывающих сетевые соединения - нужно будет просто вырабатывать сигналы PyQt
Понимаю, что хорошо бы это все написать и самому проверить, благо не так много, но идти неправильным путем, чтобы потом постоянно подставлять костыли
P.S. Насколько жизнеспособен сокет-сервер на asyncore? Или, если проект вырастет нужно будет его переписывать на чем-то другом? В пределах питона или нет?
P.S.S. система на ubuntu 9.10, python 2.6
Отредактировано (Фев. 8, 2011 16:48:33)
Офлайн
Я бы вообще не смешивал эти сущности.
Сделайте ручки в своем сервере для задания настроек и мониторинга, а GUI часть сделайте отдельным приложением, которое эти ручки исполользует.
Офлайн
смотрим на примере твистеда как интегрироваться в qt mainloop. крутить любой из мейнлупов в треде - очень плохая идея.
multiprocessing при правильном использовании будет работать.
Офлайн
Александр Кошелев спасибо, но как-то слишком абстрактно. Вы предлагаете городить еще один сетевой протокол и в ГУИ приложении будет просто один сокет, вместо множества? А что делать, если потребуется прокачивать через него множество данных, аля WireShark?
cybergrind спасибо за наводку. Насколько я вижу, основная суть в использовании QSocketNotifier для опроса готовности сокетов + дополнительный таймер, чтобы выполнять некие действия из Twisted. То есть достаточно подложить под обработчики из asyncore прокладку в виде QSocketNotifier и выкинуть asyncore.loop()?
крутить любой из мейнлупов в треде - очень плохая идея.А можно про это чуть подробнее? Что такого криминального обработке некоего количества (пусть и достаточно большого) неблокируемых сокетов в отдельном потоке (ведь asyncore по сути делает только это, почти без лишних действий). Ведь если не пихать в него огромные обработчики, то почти 99% времени он будет сидеть в ожидании I/O. Конечно, ему приоритет может не придти долго, но тут уже больше проблемы разработчика
Офлайн