Форум сайта python.su
Ну, допустим, мне нужен асинхронный клиент для сервера. Использую примеры из asynchat: http://www.doughellmann.com/PyMOTW/asynchat/index.html . Запустил я asyncore.loop(). Как мне заставить класс клиента в этом цикле обрабатывать таски, поступающие к нему в Queue, без разрыва соединения? Надо запускать этот loop() в отдельном потоке?
Офлайн
Теоретический, т.к. тут запускается loop, значит не только сокеты асинхронные, но и весь процесс.
Значит нужно делать асинхронный обработчик тасков - поступил таск, добавляем в loop очередь обработчик с указанием callback'a, когда обработчик отработает таск, он вызывает калбек где мы посылаем ответ хосту и закрываем соединение. При этом обработчик не должен “лочить” процесс - должен запустить таск и отдать управление, - получить сигнал о завершении таска и вызвать callback.
типа того…
таски можно отрабатывать в потоке, но они будут мешать loop'у, лучше сделать в отдельный процесс или управление по сети.
Офлайн
o7412369815963
Спасибо за рассуждения, но это я более-менее и сам понимаю. Меня интересует конкретный код, как заставить объект соединения внутри loop() доставать сообщения из очереди, и как пихать эти сообщения в нее в обход лупа.
Офлайн
Рекомендую сделать локальный сокет, и через него себе же слать сообщения. Этот сокет и будет очередью.
Офлайн
Андрей Светлов
А можно пример кода? Я так понимаю, в таком случае наследник asynchat.async_chat становится и клиентом, и сервером, только принимает входящие данные с другого сокета (например, unix)? И да, пайп тут не лучше подойдет?
Отредактировано (Окт. 26, 2011 14:44:01)
Офлайн
Сделал пока в потоке через обычную очередь - http://pastie.org/2762611
Меня смущает, что wireshark показывает, что в таком случае много пакетов слепляется в один. Ошибок вроде как нет, но сама ситуация странная:
http://img846.imageshack.us/img846/4944/92561041.png
И да, завершение по Ctrl+C некорректно работает, думаю, как покрасивее сделать…
Отредактировано (Окт. 26, 2011 19:08:05)
Офлайн