Модераторы: ginnie, korob2001, JackYF

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> perl и потоки? 
:(
    Опции темы
spin2
Дата 6.3.2009, 16:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 598
Регистрация: 15.12.2005
Где: Москва-Одесса

Репутация: нет
Всего: 31



Нужен совет. 
Есть такая задача - нужно опрашивать маршрутизаторы (порядка 100 штук) по SNMP и собирать с них определенные переменные (около 15) с интервалом в 5 минут. Поскольку опрашивать нужно достаточно часто, то нужно аккуратно все написать, чтобы не получалось так, что если какой-то маршрутизатор не отвечает, то все сразу зависает надолго. Я так понимаю, что нужно использовать потоки? Я просто с ними не работала до этого, поэтому есть немного вопросов. Сколько потоков можно создавать, чтобы систему не вешать? ОС будет либо Red Hat, либо Solaris. И по какому принципу стоит создавать потоки? На маршрутизаторы или на переменные? Можно, например, создать n потоков, распределять маршрутизаторы между ними и если какой-то маршрутизатор не отвечает, то отправлять роутеры в другие потоки. Или та же логика, но по отношению к переменным. Еще есть такое обстоятельство, что если переменная собирается по маршрутизатору в целом, а не по интерфейсам, то она вся записываться в единый файл для всех роутеров.
На чем это лучше писать? На perl, C++ или python? И правильна ли сама мысль о потоках?



--------------------
"С кем тяжело молчать, с тем не о чем говорить" (Метерлинк)
блог
Все об ICQ-ботах
PM MAIL WWW ICQ Skype Jabber   Вверх
NuINu
Дата 7.3.2009, 12:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 131
Регистрация: 19.7.2008

Репутация: нет
Всего: 6



вот там есть мои примеры как работать с потоками и как работать с задачами, потоки это не единствнный выход(впрочем так же как и задачи) просто в данных абстракциях код относящийся к определенной работе достаточно хорошо изолируется в функции, чего очень тяжело достичь при использовании select/poll, хотя и можно, на перле аналога не помню, но на питоне есть twisted, на перле тоже такой есть.

вот смотрите.
http://forum.vingrad.ru/forum/topic-247455...1%82%D1%8C.html
PM MAIL   Вверх
tolkien
Дата 8.3.2009, 21:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 277
Регистрация: 5.4.2008

Репутация: нет
Всего: 4



Что хорошего знаете на том и пишите. На перл надо делать через процессы, а не потоки.
PM MAIL   Вверх
spin2
Дата 10.3.2009, 15:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 598
Регистрация: 15.12.2005
Где: Москва-Одесса

Репутация: нет
Всего: 31



tolkien, процессы - долго и систему жалко.
NuINu, спасибо, посмотрю.


--------------------
"С кем тяжело молчать, с тем не о чем говорить" (Метерлинк)
блог
Все об ICQ-ботах
PM MAIL WWW ICQ Skype Jabber   Вверх
ginnie
Дата 10.3.2009, 15:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

Репутация: 6
Всего: 49



spin2, я, как обычно, предлагаю сделать при помощи событийной машины на EV. Создаете нужное количество SNMP-запросов и таймер, запускаете событийную машину, затем обрабатываете результаты. Это самый простой вариант, который можно развивать в нужном направлении.


--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
Валерия
Дата 11.3.2009, 04:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 598
Регистрация: 10.3.2007

Репутация: нет
Всего: 8



tolkien, почему через процессы?
Да и могут ли быть shared переменные между процессами?

Это сообщение отредактировал(а) Валерия - 11.3.2009, 04:37
PM MAIL   Вверх
klem4
Дата 11.3.2009, 07:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 100
Регистрация: 27.7.2008

Репутация: нет
Всего: 2



Цитата

Да и могут ли быть shared переменные между процессами?


Да, могут.
PM MAIL   Вверх
ginnie
Дата 11.3.2009, 12:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

Репутация: 6
Всего: 49



Цитата(klem4 @  11.3.2009,  07:35 Найти цитируемый пост)
Да, могут.

А можно пример увидеть?


--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
KSURi
Дата 11.3.2009, 14:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 887
Регистрация: 8.6.2006
Где: Russia

Репутация: 5
Всего: 27



ginnie, shared memory. На CPAN есть реализации.


--------------------
Died at Life.pl line 21
PM Jabber   Вверх
spin2
Дата 11.3.2009, 14:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 598
Регистрация: 15.12.2005
Где: Москва-Одесса

Репутация: нет
Всего: 31



Цитата(ginnie @  10.3.2009,  15:56 Найти цитируемый пост)
при помощи событийной машины на EV

А можно поподробнее немного? Звучит неплохо.


--------------------
"С кем тяжело молчать, с тем не о чем говорить" (Метерлинк)
блог
Все об ICQ-ботах
PM MAIL WWW ICQ Skype Jabber   Вверх
ginnie
Дата 11.3.2009, 15:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

Репутация: 6
Всего: 49



KSURi, сам я shared memory не пользовался, но, судя по описанию, это не совсем "shared переменные". Поэтому я и попросил пример, вдруг есть еще механизмы, о которых я не знаю?


--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
ginnie
Дата 11.3.2009, 16:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

Репутация: 6
Всего: 49



spin2, событийная машина позволяет реализовать асинхронную передачу данных для нескольких соединений в рамках одного процесса. Самый быстрый модуль, с которым я имел дело - EV. Суть событийной машины в следующем. Предположим нам надо получить данные от двух серверов. Стандартно это делается так: соединяемся с первым сервером, посылаем запрос, получаем ответ, закрываем соединение, соединяемся со вторым сервером... В случае если соединение установить невозможно, программа будет ожидать до истечения таймаута. Если использовать событийную машину, то алгоритм будет таким: открываем сокет к первому серверу в неблокируемом режиме (не дожидаясь соединения) и создаем функцию-обработчик записи в сокет, открываем сокет ко второму серверу в неблокируемом режиме и создаем функцию-обработчик записи в сокет, создаем таймер для завершения обработки по истечении таймаута (можно задать отдельные таймеры для каждого соединения, по желанию). Запускаем цикл обработки событий. После установления соединения с одним из серверов будет вызвана соответствующая функция-обработчик. Например, для первого сервера. Внутри этой функции мы выполняем запрос к удаленному серверу и создаем функцию-обработчик чтения из сокета, после завершения функции-обработчика записи управление передается обратно в цикл обработки событий (во время выполнения функции-обработчика другие события не обрабатываются, т.к. у нас один поток выполнения). После ответа первого сервера на наш запрос вызывается функция-обработчик для чтения, в которой мы получаем данные из сокета и сохраняем их (или обрабатываем). После получения всех данных закрываем соединение. Функция-обработчик чтения вызывается по мере получения данных от сервера многократно. После получения всех данных от сервера закрываем соденинение. После закрытия всех соединений (или срабатывания таймера) завершаем цикл обработки сообщений.

Сама идея событийной машины проста, но при реализации возникают некоторые сложности. В основном они связаны с передачей данных в функции-обработчики (очень часто это делается при помощи замыканий, что делает код непрозрачным  smile). Дмитрий Карасик сделал попытку упростить использование событийной машины при помощи модуля IO::Lambda, но я, к своему стыду, не сподобился им попользоваться, т.к. все, что было нужно написал на EV.

С радостью отвечу на конкретные вопросы по теме, если они возникнут.

Это сообщение отредактировал(а) ginnie - 11.3.2009, 16:16


--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
klem4
Дата 11.3.2009, 16:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 100
Регистрация: 27.7.2008

Репутация: нет
Всего: 2



Цитата

KSURi, сам я shared memory не пользовался, но, судя по описанию, это не совсем "shared переменные". Поэтому я и попросил пример, вдруг есть еще механизмы, о которых я не знаю?


Ничего нового я вам не скажу smile Да, по пописанию они не совсем shared переменные как вы правильно выразились. Но факт остается фактом, можно скажем скапливать данные из нескольких потоков в один массив.

Вот простенький примерчик

Код

#!/usr/bin/perl 
use strict;
use threads;
use threads::shared;

  my @share: shared;

  for (1..3) {
    new threads(\&foo, $_);
  }

  $_->join for ( threads->list );

  print join "\n", @share, "\n";

sub foo {
  my $thread_num = shift;
  printf "thread %d started at %s\n", $thread_num, scalar localtime time;
  push @share, $thread_num;
}

PM MAIL   Вверх
ginnie
Дата 11.3.2009, 16:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

Репутация: 6
Всего: 49



klem4, насколько я помню, речь шла о разных процессах, а не потоках!


--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
klem4
Дата 11.3.2009, 16:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 100
Регистрация: 27.7.2008

Репутация: нет
Всего: 2



Цитата(заглавие темы)

 perl и потоки?


 smile 
PM MAIL   Вверх
Google
  Дата 20.3.2019, 01:50 (ссылка)  





  Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl: Системное программирование"
korob2001
sharq
  • В этом разделе обсуждаются вопросы относящиеся только к системному программированию на Perl
  • Если ваш вопрос не относится к системному или CGI программированию, задавайте его в общем разделе
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.1125 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.