Уведомления

Группа в Telegram: @pythonsu

#1 Окт. 25, 2011 17:36:26

Enchantner
От:
Зарегистрирован: 2009-02-11
Сообщения: 442
Репутация: +  0  -
Профиль   Отправить e-mail  

Глупый вопрос по asynchat/asyncore

Ну, допустим, мне нужен асинхронный клиент для сервера. Использую примеры из asynchat: http://www.doughellmann.com/PyMOTW/asynchat/index.html . Запустил я asyncore.loop(). Как мне заставить класс клиента в этом цикле обрабатывать таски, поступающие к нему в Queue, без разрыва соединения? Надо запускать этот loop() в отдельном потоке?



Офлайн

#2 Окт. 25, 2011 21:34:50

o7412369815963
От:
Зарегистрирован: 2009-06-17
Сообщения: 1986
Репутация: +  32  -
Профиль   Отправить e-mail  

Глупый вопрос по asynchat/asyncore

Теоретический, т.к. тут запускается loop, значит не только сокеты асинхронные, но и весь процесс.
Значит нужно делать асинхронный обработчик тасков - поступил таск, добавляем в loop очередь обработчик с указанием callback'a, когда обработчик отработает таск, он вызывает калбек где мы посылаем ответ хосту и закрываем соединение. При этом обработчик не должен “лочить” процесс - должен запустить таск и отдать управление, - получить сигнал о завершении таска и вызвать callback.
типа того…
таски можно отрабатывать в потоке, но они будут мешать loop'у, лучше сделать в отдельный процесс или управление по сети.

Офлайн

#3 Окт. 25, 2011 22:17:27

Enchantner
От:
Зарегистрирован: 2009-02-11
Сообщения: 442
Репутация: +  0  -
Профиль   Отправить e-mail  

Глупый вопрос по asynchat/asyncore

o7412369815963
Спасибо за рассуждения, но это я более-менее и сам понимаю. Меня интересует конкретный код, как заставить объект соединения внутри loop() доставать сообщения из очереди, и как пихать эти сообщения в нее в обход лупа.



Офлайн

#4 Окт. 25, 2011 22:30:19

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

Глупый вопрос по asynchat/asyncore

Рекомендую сделать локальный сокет, и через него себе же слать сообщения. Этот сокет и будет очередью.



Офлайн

#5 Окт. 26, 2011 13:07:30

Enchantner
От:
Зарегистрирован: 2009-02-11
Сообщения: 442
Репутация: +  0  -
Профиль   Отправить e-mail  

Глупый вопрос по asynchat/asyncore

Андрей Светлов
А можно пример кода? Я так понимаю, в таком случае наследник asynchat.async_chat становится и клиентом, и сервером, только принимает входящие данные с другого сокета (например, unix)? И да, пайп тут не лучше подойдет?



Отредактировано (Окт. 26, 2011 14:44:01)

Офлайн

#6 Окт. 26, 2011 19:07:05

Enchantner
От:
Зарегистрирован: 2009-02-11
Сообщения: 442
Репутация: +  0  -
Профиль   Отправить e-mail  

Глупый вопрос по asynchat/asyncore

Сделал пока в потоке через обычную очередь - http://pastie.org/2762611

Меня смущает, что wireshark показывает, что в таком случае много пакетов слепляется в один. Ошибок вроде как нет, но сама ситуация странная:
http://img846.imageshack.us/img846/4944/92561041.png

И да, завершение по Ctrl+C некорректно работает, думаю, как покрасивее сделать…



Отредактировано (Окт. 26, 2011 19:08:05)

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version