Автор Тема: Глобальные переменные и fork  (Прочитано 8255 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Wells

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 15
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Глобальные переменные и fork
« Ответ #15 : 28 Октября 2004, 10:53:08 »
Смысл в следующем:
Пишу сетевой сканер для служебных целей.
Сканируемая сеть около 10000 узлов.
С одним потоком сканирование занимает более 3 часов.
Нужно ускорить этот процес. Решил разбить на 5 потоков (через fork). Процесс ускорился до 45 минут. Но встали проблемы с оповещением.
Алгоритм примерно следующий:
1 - $isAlert = 0;
2 - создание массивов из IP адресов, по количеству потоков сканирования;
4 - создание потоков сканирования (через fork);
5 - для каждого адреса выполняется определённая проверка. Если условие выполняется, то переходим к следующему адресу. Если нет, то нужно $isAlert присвоить 1;
6 - ожидаем окончания работы всех потоков;
7 - формируем лог;
8 - если $isAlert = 1 отправляем лог по почте админу.
9 - выход.
Всё работает. Не могу побороть только пункт 8. Точнее с 1 потоком никаких проблем нет. А больше не идёт!

P.S. PERL\'ом я занялся месяц назад. Так что жду снисхождения.

Оффлайн Wells

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 15
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Глобальные переменные и fork
« Ответ #16 : 28 Октября 2004, 13:40:08 »
Решил слепить тоже самое через Thread\'ы.
Получается следующее:

use strict;
use Thread qw(async yield);
my $var = 0;
sub child {
    {
        lock $var;
        if ($var == 0) {
            yield;
            $var++;
            print "var is $var\\n";
        }
    }
}
my $t2 = new Thread \\&child;
$t2->join;
print "var is $var\\n";

Почему в конце $var всё равно принимает старое значение?

Оффлайн NeoNox

  • Координатор
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 3012
  • +0/-0
  • 0
    • Просмотр профиля
Глобальные переменные и fork
« Ответ #17 : 28 Октября 2004, 14:43:09 »
Если уж ты на тредах решил делать (на мой взгляд это правильно) взгляни http://www.unix.org.ua/orelly/perl/prog3/ch17_02.htm
На пример  17.2.2.3. Locking subroutines
The documentations is your friend

 

Sitemap 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28