Привет всем.
Столкнулся с задачей, надо запускать команду unix и парсить ее вывод.
Команды запускаются в цикле, я посчитал что весь цикл выполняется примерно 5 минут. Как нибудь можно уменьшить время выполнения используя многопоточное выполнение или распараллеливание ?
Примеры кода приветствуются =)

Может
Может следующие будет полезным: http://kiev.pm.org/node/259
Разобрался с
Разобрался с распараллеливанием. У меня в цикле создается 400-500 нитей, в сек, после чего я жду когда все процессы завершатся, только тогда завершается основная программа. При этом обнаружил что памяти съедается немеренно. При это выводится сообщение Out of memory.
------------------
...
Может для этого сгодится POE?
Памяти потребляет умеренно, хотя, сами запускаемые процессы
потребляют в любом случае память, если переписать сами
процессы на Perl и задействовать POE, может и получиться хорошо.
Не знаю даже, как? Да и POE не идеал.
--- Интересный ресурс нашел:
http://xpoint.ru/forums/programming/perl/
...
Кроме win32, solaris, irix, практически нет разницы, fork или thread - что так что эдак запускается обычный процесс, делается копия окружения и тд - выигрыш может быть в двух моментах - во первых если у каждого потока свой, медленный входной поток данных и во вторых если много процессоров или ядер, система может раскидать потоки по ним и будет соответствующее ускорение.
Еще вариант - просто внутри своей программы сделать имитацию нескольких потоков обработки через автоматное программирование, но это сложно и тоже существенный выигрыш будет только если много потоков большую часть времени исполнения не работают, а ждут разных событий и эти события у всех свои и не пересекаются.
Ну еще теоритически в Perl есть внутренняя многопотоковость, когда несколько прог работают внутри одного интерпретатора, причем там есть и семафоры и даже свой, изолированный от других потоков набор переменных у каждого потока, но я никогда не слышал чтобы его кто-то серьезно применял, и опять-же - если будут жаждать исполнения все потоки, процессорное время будет просто поделено между ними, да плюс еще менеджер потоков что-то скушает, причем интерпретатор Perl не умеет работать на нескольких процессорах или ядрах одновременно.
...
--- Ещё один классный ресурс, на английском, но рульный!
http://www.stonehenge.com/merlyn/UnixReview/
Как много все таки ресурсов по Perl!
Удивительно! Действительно, Perl всемогуч!!!
Решил решить
Решил решить задачу без использования многопоточности, нашел более быстрый вариант (парсить вывод утилиты из пакеты arptools).
------------------
А что раньше
А что раньше делалось?
Задача была
Задача была сканить сеть быстро и собирать информацию какие хосты в сети -> писать это дело в БД. Потом вывод через WEB.
Я слал ether пакеты через утилиту arping, типа того:
Таким образом мне надо было получить ответы из 5 подсетей. Все занимало примерно 5 минут. Многопоточность стала памят отжирать, и в общем я забил на это дело.
Сделал так: нашел утилиту [b]arpdiscovery[/b] из пакета arptools оно умеет секунды за 4 посеть сканить (10.10.10.0/16 - "arpdiscovery 10.10.10.0 255") и вываливает результат.
------------------
А у вас сеть
А у вас сеть одноранговая, то есть клиенты связываются в основном между собой или все-таки обязательно связываются с сервером?
Все в одной
Все в одной подсети, если будут роутеры, то будем arp-proxy ставить..
------------------
То есть вам
То есть вам просто нужно собрать список всех mak-адресов?
- Так я делал по-другому - у меня скриптик просто периодически запускает arp -an и пишет лог кто когда появился и исчез, а потом полученный лог очень быстро парсится перлом, если сильно захочется можно писать сразу в базу данных и там уже делать какие угодно выборки.
Точно, спасибо
Точно, спасибо за наводку, я об этом не модумал.. Но для этого должен быть сервер на которые все организмы буду ломиться полюбому.. Благо твой серв есть =)
------------------
Не за что :)
Сервак на который все будут обязательно ломиться это DNS и главный гейтвей (или прокси), конечно лучше всего DNS, потому что у его меньше загрузка и ему этот скрипт не будет критичен.
Время жизни одной строчки arp-преобразования около 5 минут, то есть если их проверять чаще чем раз в 5 минут, ничего не потеряется, я для надежности ставил в cron раз в 2 минуты.