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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблема с потоками в Perl 
:(
    Опции темы
Qwadrat
Дата 23.7.2009, 04:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



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

#!/usr/bin/perl -w

use Net::Ping;
use strict;
use threads;

open (my $fh, '<', 'hosts.txt');

while (my $line = <$fh> ) {
    my @list = split(';', $line);
    threads->new(\&do_ping, $list[0],$list[1],$list[2]);
}

foreach my $thread (threads->list) {
    if ($thread->tid && !threads::equal($thread, threads->self)) {
        $thread->join;
    }
}

sub do_ping
{
    my ($host,$ip,$loops) = @_;
    my $p = Net::Ping->new("icmp");
    my $fails = 0;
    for (my $i=0; $i < $loops; $i++) {
        if ($p->ping($ip,2)) { }
        else { $fails++; }
    }

    if ($fails == $loops) {
        print "$host is unreachable. Fail count: $fails\n";
    }
    else {
        print "$host is responding. Fail count: $fails\n";
    }
    $p->close();
}
close $fh;

Каждый поток создает объект $p и выполняет $p->ping. Вроде как для каждого потока должен создаваться отдельный объект $p, но на деле $p->ping возвращает одинаковое значение для всех потоков, даже для тех, которые не должны пинговаться.
Как сказать Перлу создавать уникальный объект, не пересекающийся с другими потоками?
PM MAIL   Вверх
gcc
Дата 23.7.2009, 06:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Агент алкомафии
****


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

Репутация: 1
Всего: 17



smokeping smile
многопоточная штука для пингования
PM WWW ICQ Skype GTalk Jabber   Вверх
sir_nuf_nuf
Дата 23.7.2009, 10:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Qwadrat @  23.7.2009,  04:52 Найти цитируемый пост)
Как сказать Перлу создавать уникальный объект, не пересекающийся с другими потоками? 

По идее - это поведение "по умолчанию", обычно наоборот нужно говорить, чтобы расшарить данные между потоками.

Еще раз New::Ping->new или $p->ping возвращает одно и то же ?
Может все хосты просто пингуются на ок ?
Как вы определили что одно и то же ?


--------------------
user posted image
user posted image
PM MAIL Jabber   Вверх
Qwadrat
Дата 23.7.2009, 11:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



В списке хостов забиты заведомо неправильный ip, которые не должны пинговаться
Но в этом куске кода результат выполнения всегда истина, т.е. $fails никогда не увеличивается.
Код

        if ($p->ping($ip,2)) { }
        else { $fails++; }

А почему так происходит не могу понять.
PM MAIL   Вверх
sir_nuf_nuf
Дата 23.7.2009, 11:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Блин, у меня перл без потоков собран =(

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

Как я понял Net::Ping перловый модуль.. посему должен работать с потоками автоматически. Некоторые XS модули не thread-safe, т.е. не работают в многопоточном режиме.


--------------------
user posted image
user posted image
PM MAIL Jabber   Вверх
Qwadrat
Дата 23.7.2009, 12:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Да, именно в многопоточном.
Без потоков все работает как надо, просто при количестве хостов более 30 скорость работы скрипта уже не приемлема, поэтому хочется, чтобы каждый хост пинговался в отдельном потоке.
Если запустить один тред с нерабочим хостом, скрипт тоже отрабатывает как надо, говорит что хост недоступен.

Быть может действительно проблема именно в Net::Ping и стоит поискать альтернативу...
PM MAIL   Вверх
sir_nuf_nuf
Дата 23.7.2009, 12:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Qwadrat, Да. тогда вполне вероятно, что Net::Ping либо сам не thread-safe, либо используюет такой модуль.

Только советую искать альтернативу не Net::Ping'у а потокам. Потоки в перле - не совсем надежная вещь.  
Как вариант:
1) использовать процессы вместо потоков и IPC
2) использовать асинхронную работу с сетью. Для этого дела есть пара надежных фреймворков:
POE и EV. Смотрите CPAN. Сами - по себе они универсальные,  для любых асинхронных операций, но для них есть плагин, позволяющие пинговать сервер асинхронно. Например POE::Component::Client::Ping 


В случае 2) вы работает в однопоточном режиме.

Это сообщение отредактировал(а) sir_nuf_nuf - 23.7.2009, 12:58


--------------------
user posted image
user posted image
PM MAIL Jabber   Вверх
Qwadrat
Дата 23.7.2009, 13:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Нашел модуль Net::PingICMP, работающий под Windows. С полностью аналогичным синтаксисом все работает в многопоточном режиме, так что проблема точно в Net::Ping.

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


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

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


 




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


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

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