Найти - Пользователи
Полная версия: Глупый вопрос по asynchat/asyncore
Начало » Network » Глупый вопрос по asynchat/asyncore
1
Enchantner
Ну, допустим, мне нужен асинхронный клиент для сервера. Использую примеры из asynchat: http://www.doughellmann.com/PyMOTW/asynchat/index.html . Запустил я asyncore.loop(). Как мне заставить класс клиента в этом цикле обрабатывать таски, поступающие к нему в Queue, без разрыва соединения? Надо запускать этот loop() в отдельном потоке?
o7412369815963
Теоретический, т.к. тут запускается loop, значит не только сокеты асинхронные, но и весь процесс.
Значит нужно делать асинхронный обработчик тасков - поступил таск, добавляем в loop очередь обработчик с указанием callback'a, когда обработчик отработает таск, он вызывает калбек где мы посылаем ответ хосту и закрываем соединение. При этом обработчик не должен “лочить” процесс - должен запустить таск и отдать управление, - получить сигнал о завершении таска и вызвать callback.
типа того…
таски можно отрабатывать в потоке, но они будут мешать loop'у, лучше сделать в отдельный процесс или управление по сети.
Enchantner
o7412369815963
Спасибо за рассуждения, но это я более-менее и сам понимаю. Меня интересует конкретный код, как заставить объект соединения внутри loop() доставать сообщения из очереди, и как пихать эти сообщения в нее в обход лупа.
Андрей Светлов
Рекомендую сделать локальный сокет, и через него себе же слать сообщения. Этот сокет и будет очередью.
Enchantner
Андрей Светлов
А можно пример кода? Я так понимаю, в таком случае наследник asynchat.async_chat становится и клиентом, и сервером, только принимает входящие данные с другого сокета (например, unix)? И да, пайп тут не лучше подойдет?
Enchantner
Сделал пока в потоке через обычную очередь - http://pastie.org/2762611

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

И да, завершение по Ctrl+C некорректно работает, думаю, как покрасивее сделать…
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