Создание службы запросов-ответов SNMP с помощью Python Asyncore - PullRequest
1 голос
/ 13 апреля 2010

У меня есть сторонний модуль протокола (SNMP), который построен поверх асинхронного. Асинхронный интерфейс используется для обработки ответных сообщений. Какова правильная методика для разработки клиента, который генерирует сторону запроса протокола, в то время как работает основной цикл asyncore. Я могу думать о двух вариантах прямо сейчас:

  1. Используйте цикл, параметры тайм-аута asyncore.loop (), чтобы позволить моей клиентской программе отправлять соответствующий запрос.

  2. Создание клиентского асинхронного диспетчера, который будет выполняться в том же цикле асинхронной обработки, что и получатель.

Какой вариант лучше? Я работаю над вторым решением, потому что API протокола не дает мне прямой доступ к параметрам асинхронности. Пожалуйста, поправьте меня, если я неправильно понял правильную технику использования асинкоры.

1 Ответ

1 голос
/ 29 апреля 2010

Я решил это, добавив функцию обратного вызова в асинхронный цикл для процесса получателя.

Решение было несколько специфичным для модуля, с которым я экспериментировал (pySNMP), но вот общая идея:

  1. определяет закрытие функции, которое возвращает вызываемый метод с сохраненной ссылкой на переменные dict и window. dict отслеживает ожидаемые ответы, а window - размер буфера отправителя.

  2. передать ссылку на функцию закрытия в настроенный экземпляр asyncore.dispatcher. Функция обратного вызова может быть выполнена в вызове метода writeable.

  3. установить для тайм-аута диспетчера небольшое значение. Это предотвращает асинхронное блокирование слишком долго, ожидая полученных пакетов. Я использовал 0,05 секунды. Чем ниже вы пойдете, тем больше отклик у вашего приложения, но не слишком низко.

  4. обновить asyncore метод read_handle, чтобы удалить полученные ответы из вашей глобальной dict структуры. Это позволит передавать новые сообщения.

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

...