LINUX.ORG.RU

Python и сокеты


0

0

Задача: Простая в общем-то. Прога создает серверный сокет и, по мере подключения на него клиентов, вызывает функцию нового подключения. Всё остальное время что-то делает, т.е. тупо ждать коннекта нельзя.

Проблема: Как реализовать событийный интерфейс к сокетам, не прибегая к таким монстрам, как Qt (там это тривиально, но не хотелось бы из-за такой мелочи тащить Qt).

PS: Как-то это должно делаться элементарно, но что-то никак не допру, как :(

Заранее спасибо.

★★★★

Не знаю, как и что в питоне, но вообще смотреть в сторону select и неблокирующих сокетов.

ach
()

>по мере подключения на него клиентов, вызывает функцию нового подключения. Всё остальное время что-то делает, т.е. тупо ждать коннекта нельзя. В чем проблема-то? создаешь ждущий поток, в котором после коннекта также в потоке запускается "функция нового подключения". А основной поток управления в это время занимается чем угодно...

anonymous
()
Ответ на: комментарий от Ximen

вообщето реализуется. Только там какието нюансы появляются, характерные только для большого змия, кажись в плане производительности/времени реакции

cvv ★★★★★
()
Ответ на: комментарий от cvv

Это в общем-то не критично. Я сам принцип не пойму. Не создавать же отдельный поток для такой ерунды...

Ximen ★★★★
() автор топика
Ответ на: комментарий от cvv

От сильно сомневаюсь, что с питоновскими потоками производительность/время реакции будет лучше, чем с select/poll.

Вообще, нефиг совать потоки туда, где они нафиг не нужны.

ero-sennin ★★
()
Ответ на: комментарий от ero-sennin

Во. Я тоже так думаю. Но подскажите тогда каким путем реализуется вышепоставленная задача? Методика какая?

Ximen ★★★★
() автор топика
Ответ на: комментарий от Reset

Да дело-то не в этом. Дело в том, что работа с любыми (в том числе и не настоящими) потоками - это ненужное захламление кода. Если, конечно, можно обойтись без них. Зачем без надобности усложнять код, если можно подумать и сделать проще?

Ximen ★★★★
() автор топика

Первая ссылка из гугла на запрос "python sockets":

http://www.amk.ca/python/howto/sockets/

Читаем, особенно тщательно вникаем в "5 Non-blocking Sockets". Когда просветление наступило идем сюда:

http://docs.python.org/lib/module-asyncore.html http://docs.python.org/lib/module-asynchat.html

Читаем, понимаем, что уже все реализовано и используем классы из стандартной библиотеки.

anonymous
()
Ответ на: комментарий от anonymous

> Первая ссылка из гугла на запрос "python sockets":

Угу. Гугол я тоже умею.

> Читаем, особенно тщательно вникаем в "5 Non-blocking Sockets". Когда просветление наступило идем сюда:

Вот как раз просветления я здесь и искал. Уже нашёл.

> Читаем, понимаем, что уже все реализовано и используем классы из стандартной библиотеки.

В вот с этим облом, т.к. судя по описанию, там должен быть вполне конкретный терминальный символ. А его-то и нет. Потому asyncchat идёт лесом.

Ximen ★★★★
() автор топика

Думаю что-то вроде:

1)Уствновить обработчик SIGIO.

2)С помощью команды F_SETOWN функции fcntl назначить прочесс или группу процессов, которым будет посылаться сигнал.

3)Разрешить асинхронный ввов-вывод для дескриптора(если он изначально был в блокирующем режиме) командой F_SETFL функции fcntl, установив флаг O_ASYNC.

Правда я не проверял, так как в таком случае просто форкнул бы в самом начале и использовал select в сопроцессе.

Sidrian
()
Ответ на: комментарий от Ximen

> В вот с этим облом, т.к. судя по описанию, там должен быть вполне конкретный терминальный символ. А его-то и нет. Потому asyncchat идёт лесом.

Внимательнее читайте документацию - в жизни сильно поможет. Asynchat это лишь сабкласс asyncore для обработки сообщений с завершающим символом. Надеюсь, догадаетесь, что asyncore это класс, который просто обрамляет select и poll в объекто-ориентированную обертку, и на основе которого можно строить любые приложения работающие с неблокирующими сокетами.

anonymous
()
Ответ на: комментарий от anonymous

Да, спасибо. Всё так и есть. Действительно невнимательно прочитал...

Ximen ★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.