![]() |
|
Модераторы: ginnie, korob2001 |
![]()
|
|
| spin2 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 598 Регистрация: 15.12.2005 Где: Москва-Одесса Репутация: нет Всего: 31 |
Нужен совет.
Есть такая задача - нужно опрашивать маршрутизаторы (порядка 100 штук) по SNMP и собирать с них определенные переменные (около 15) с интервалом в 5 минут. Поскольку опрашивать нужно достаточно часто, то нужно аккуратно все написать, чтобы не получалось так, что если какой-то маршрутизатор не отвечает, то все сразу зависает надолго. Я так понимаю, что нужно использовать потоки? Я просто с ними не работала до этого, поэтому есть немного вопросов. Сколько потоков можно создавать, чтобы систему не вешать? ОС будет либо Red Hat, либо Solaris. И по какому принципу стоит создавать потоки? На маршрутизаторы или на переменные? Можно, например, создать n потоков, распределять маршрутизаторы между ними и если какой-то маршрутизатор не отвечает, то отправлять роутеры в другие потоки. Или та же логика, но по отношению к переменным. Еще есть такое обстоятельство, что если переменная собирается по маршрутизатору в целом, а не по интерфейсам, то она вся записываться в единый файл для всех роутеров. На чем это лучше писать? На perl, C++ или python? И правильна ли сама мысль о потоках? -------------------- |
|||
|
||||
| NuINu |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 131 Регистрация: 19.7.2008 Репутация: нет Всего: 6 |
вот там есть мои примеры как работать с потоками и как работать с задачами, потоки это не единствнный выход(впрочем так же как и задачи) просто в данных абстракциях код относящийся к определенной работе достаточно хорошо изолируется в функции, чего очень тяжело достичь при использовании select/poll, хотя и можно, на перле аналога не помню, но на питоне есть twisted, на перле тоже такой есть.
вот смотрите. http://forum.vingrad.ru/forum/topic-247455...1%82%D1%8C.html |
|||
|
||||
| tolkien |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 277 Регистрация: 5.4.2008 Репутация: нет Всего: 4 |
Что хорошего знаете на том и пишите. На перл надо делать через процессы, а не потоки.
|
|||
|
||||
| spin2 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 598 Регистрация: 15.12.2005 Где: Москва-Одесса Репутация: нет Всего: 31 |
tolkien, процессы - долго и систему жалко.
NuINu, спасибо, посмотрю. -------------------- |
|||
|
||||
| ginnie |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1287 Регистрация: 6.1.2008 Где: Москва Репутация: 6 Всего: 49 |
spin2, я, как обычно, предлагаю сделать при помощи событийной машины на EV. Создаете нужное количество SNMP-запросов и таймер, запускаете событийную машину, затем обрабатываете результаты. Это самый простой вариант, который можно развивать в нужном направлении.
-------------------- Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг) |
|||
|
||||
| Валерия |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 598 Регистрация: 10.3.2007 Репутация: нет Всего: 8 |
tolkien, почему через процессы?
Да и могут ли быть shared переменные между процессами? Это сообщение отредактировал(а) Валерия - 11.3.2009, 04:37 |
|||
|
||||
| klem4 |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 100 Регистрация: 27.7.2008 Репутация: нет Всего: 2 |
Да, могут. |
|||
|
||||
| ginnie |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1287 Регистрация: 6.1.2008 Где: Москва Репутация: 6 Всего: 49 |
-------------------- Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг) |
|||
|
||||
| KSURi |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 887 Регистрация: 8.6.2006 Где: Russia Репутация: 5 Всего: 27 |
ginnie, shared memory. На CPAN есть реализации.
-------------------- Died at Life.pl line 21 |
|||
|
||||
| spin2 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 598 Регистрация: 15.12.2005 Где: Москва-Одесса Репутация: нет Всего: 31 |
А можно поподробнее немного? Звучит неплохо. -------------------- |
|||
|
||||
| ginnie |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1287 Регистрация: 6.1.2008 Где: Москва Репутация: 6 Всего: 49 |
KSURi, сам я shared memory не пользовался, но, судя по описанию, это не совсем "shared переменные". Поэтому я и попросил пример, вдруг есть еще механизмы, о которых я не знаю?
-------------------- Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг) |
|||
|
||||
| ginnie |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1287 Регистрация: 6.1.2008 Где: Москва Репутация: 6 Всего: 49 |
spin2, событийная машина позволяет реализовать асинхронную передачу данных для нескольких соединений в рамках одного процесса. Самый быстрый модуль, с которым я имел дело - EV. Суть событийной машины в следующем. Предположим нам надо получить данные от двух серверов. Стандартно это делается так: соединяемся с первым сервером, посылаем запрос, получаем ответ, закрываем соединение, соединяемся со вторым сервером... В случае если соединение установить невозможно, программа будет ожидать до истечения таймаута. Если использовать событийную машину, то алгоритм будет таким: открываем сокет к первому серверу в неблокируемом режиме (не дожидаясь соединения) и создаем функцию-обработчик записи в сокет, открываем сокет ко второму серверу в неблокируемом режиме и создаем функцию-обработчик записи в сокет, создаем таймер для завершения обработки по истечении таймаута (можно задать отдельные таймеры для каждого соединения, по желанию). Запускаем цикл обработки событий. После установления соединения с одним из серверов будет вызвана соответствующая функция-обработчик. Например, для первого сервера. Внутри этой функции мы выполняем запрос к удаленному серверу и создаем функцию-обработчик чтения из сокета, после завершения функции-обработчика записи управление передается обратно в цикл обработки событий (во время выполнения функции-обработчика другие события не обрабатываются, т.к. у нас один поток выполнения). После ответа первого сервера на наш запрос вызывается функция-обработчик для чтения, в которой мы получаем данные из сокета и сохраняем их (или обрабатываем). После получения всех данных закрываем соединение. Функция-обработчик чтения вызывается по мере получения данных от сервера многократно. После получения всех данных от сервера закрываем соденинение. После закрытия всех соединений (или срабатывания таймера) завершаем цикл обработки сообщений.
Сама идея событийной машины проста, но при реализации возникают некоторые сложности. В основном они связаны с передачей данных в функции-обработчики (очень часто это делается при помощи замыканий, что делает код непрозрачным С радостью отвечу на конкретные вопросы по теме, если они возникнут. Это сообщение отредактировал(а) ginnie - 11.3.2009, 16:16 -------------------- Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг) |
|||
|
||||
| klem4 |
|
||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 100 Регистрация: 27.7.2008 Репутация: нет Всего: 2 |
Ничего нового я вам не скажу Вот простенький примерчик
|
||||
|
|||||
| ginnie |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1287 Регистрация: 6.1.2008 Где: Москва Репутация: 6 Всего: 49 |
klem4, насколько я помню, речь шла о разных процессах, а не потоках!
-------------------- Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг) |
|||
|
||||
| klem4 |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 100 Регистрация: 27.7.2008 Репутация: нет Всего: 2 |
|
|||
|
||||
![]()
|
| Правила форума "Perl: Системное программирование" | |
|
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Perl: Системное программирование | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |