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