The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  ВХОД  слежка  RSS
"ускорить работу скрипта - fork?"
Вариант для распечатки  
Пред. тема | След. тема 
Форумы Программирование под UNIX (Public)
Изначальное сообщение [Проследить за развитием треда]

"ускорить работу скрипта - fork?" 
Сообщение от jr emailИскать по авторуВ закладки(ok) on 05-Окт-05, 23:44  (MSK)
Есть скрипт perl, который поочередно опрашивает сетевые устройства (порядка 1000 штук). Что-то типа:

#!/bin/perl

@hosts = ( "192.168.0.1", "192.168.0.2", и т.д );
foreach $ip ( @hosts ) {
   $res = MyFunc ( $ip );
   print "$ip -> $res\n";
}

Процесс работы с каждым устройством занимает, например, секунд 15. Причем это время затрачивается на отклики от устройств, а не на расчеты скрипта. Отсюда логичное решение делать одновременный опрос сразу нескольких устройств для ускорения общей работы скрипта. Т.е. грубо говоря, можно породить, скажем, процессов 10, каждый процесс для одного $ip, и как только один процесс завершается, запускать новый для следующего не обработанного $ip. И так, пока не обработается весь список @hosts. Подозреваю, что мне может помочь функция fork, но как ее реализовать пока плохо понимаю...
Как это можно сделать?

  Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

 Оглавление

Индекс форумов | Темы | Пред. тема | След. тема
Сообщения по теме

1. "ускорить работу скрипта - fork?" 
Сообщение от Av Искать по авторуВ закладки(??) on 06-Окт-05, 07:31  (MSK)
>#!/bin/perl
>
>@hosts = ( "192.168.0.1", "192.168.0.2", и т.д );
>foreach $ip ( @hosts ) {
>   $res = MyFunc ( $ip );
>   print "$ip -> $res\n";
>}
>
>Процесс работы с каждым устройством занимает, например, секунд 15. Причем это время
>затрачивается на отклики от устройств, а не на расчеты скрипта. Отсюда
>логичное решение делать одновременный опрос сразу нескольких устройств для ускорения общей
>работы скрипта. Т.е. грубо говоря, можно породить, скажем, процессов 10, каждый
>процесс для одного $ip, и как только один процесс завершается, запускать
>новый для следующего не обработанного $ip. И так, пока не обработается
>весь список @hosts. Подозреваю, что мне может помочь функция fork, но
>как ее реализовать пока плохо понимаю...
>Как это можно сделать?

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

  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

2. "ускорить работу скрипта - fork?" 
Сообщение от maxim emailИскать по авторуВ закладки(??) on 07-Окт-05, 14:16  (MSK)
>Есть скрипт perl, который поочередно опрашивает сетевые устройства (порядка > 1000 штук).

Аналогичная порблема решалась на perl так :

#!/usr/bin/perl

my $scripts=1; # number of process
for ($i = 1; $i <=$scripts ; $i++){
        if (!defined($pid = fork())) {
                die "cannot fork: $!" ;
        } elsif(!$pid) {
                # тут
}


  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

3. "ускорить работу скрипта - fork?" 
Сообщение от maxim emailИскать по авторуВ закладки(??) on 07-Окт-05, 14:24  (MSK)
Прошу пощения, не дописал.
Аналогичная порблема решалась на perl так :

#!/usr/bin/perl

my $scripts=3; # number of process

for ($i = 1; $i <=$scripts ; $i++){
        if (!defined($pid = fork())){
                die "cannot fork: $!" ;
        } elsif(!$pid) {
                # тут код обработки
        } else {
                $lastpid = $pid ;
                undef $pid ;
        }
}

waitpid($lastpid, 0) ;

для разделения массива @hosts между процессами можно использовать номер порожденного процесса. это в этом же форуме мне же ответили посмотри тут http://www.opennet.me/openforum/vsluhforumID9/4713.html

  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

4. "ускорить работу скрипта - fork?" 
Сообщение от jr emailИскать по авторуВ закладки(ok) on 12-Окт-05, 11:40  (MSK)
Спасибо за ответ! Идею я понял и реализовал. Но есть еще такая проблема... Родительскому процессу нужно передавать от дочерних большой объем данных. Сейчас я это делаю через временный файл. А можно ли это как-то сделать через межпроцессовые взаимодействия?

>Прошу пощения, не дописал.
>Аналогичная порблема решалась на perl так :
>
>#!/usr/bin/perl
>
>my $scripts=3; # number of process
>
>for ($i = 1; $i <=$scripts ; $i++){
>        if (!defined($pid = fork())){
>
>            
>    die "cannot fork: $!" ;
>        } elsif(!$pid) {
>            
>    # тут код обработки
>        } else {
>            
>    $lastpid = $pid ;
>            
>    undef $pid ;
>        }
>}
>
>waitpid($lastpid, 0) ;
>
>для разделения массива @hosts между процессами можно использовать номер порожденного процесса. это
>в этом же форуме мне же ответили посмотри тут http://www.opennet.me/openforum/vsluhforumID9/4713.html


  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

5. "ускорить работу скрипта - fork?" 
Сообщение от robot emailИскать по авторуВ закладки on 14-Окт-05, 10:49  (MSK)
>Спасибо за ответ! Идею я понял и реализовал. Но есть еще такая
>проблема... Родительскому процессу нужно передавать от дочерних большой

Форки в данном случае - стрельба из ПВО по воробьям. Переведи сокеты в неблокирующий режим и обрабатывай всё в одном процессе, а лучше используй POE, там всё это давно написано за тебя

  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

6. "ускорить работу скрипта - fork?" 
Сообщение от jr emailИскать по авторуВ закладки(ok) on 14-Окт-05, 12:12  (MSK)
что такое POE?
ссылочки можно, где почитать об этом
а так же, что значит "переводить сокеты в неблокирующий режим"?

>Форки в данном случае - стрельба из ПВО по воробьям. Переведи сокеты
>в неблокирующий режим и обрабатывай всё в одном процессе, а лучше
>используй POE, там всё это давно написано за тебя


  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

7. "ускорить работу скрипта - fork?" 
Сообщение от robot emailИскать по авторуВ закладки on 14-Окт-05, 13:03  (MSK)
>что такое POE?
>ссылочки можно, где почитать об этом
http://search.cpan.org/~rcaputo/POE-0.3202/lib/POE.pm

Пое - реализация примитивной многозодачности аля windows 3.11 в перле в одном процессе и одном потоке.

>а так же, что значит "переводить сокеты в неблокирующий режим"?
perldoc IO::Socket
perldoc IO::Handle

Это значит что твоя программа не будет "висеть" и ждать пока сокет сделает какое-то действие, а сразу вернёт управление тебе.

  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх


Архив | Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Оцените тред (1=ужас, 5=супер)? [ 1 | 2 | 3 | 4 | 5 ]
Пожалуйста, прежде чем написать сообщение, ознакомьтесь с данными рекомендациями.




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2025 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру