2010-06-13 2 views
3

Я пишу многопоточный веб-сайт безотказной работы проверки в Perl, и здесь основной код до сих пор (включает в себя только часть резьбы):Perl пронизывающие проблемы

#!/usr/bin/perl 

use LWP::UserAgent; 
use Getopt::Std; 
use threads; 
use threads::shared; 

my $maxthreads :shared = 50; 
my $threads :shared = 0; 

print "Website Uptime Checker\n"; 
my $infilename = $ARGV[0]; 
chomp($infilename); 
open(INFILE, $infilename); 
my $outfilename = $ARGV[1]; 
chomp($outfilename); 
open(OUTFILE, ">" . $outfilename); 
OUTFILE->autoflush(1); 
while ($site = <INFILE>) 
{ 
    chomp($site); 
    while (1) 
    { 
     if ($threads < $maxthreads) 
     { 
      $threads++; 
      my $thr = threads->create(\&check_site, $site); 
      $thr->detach(); 
      last; 
     } 
     else 
     { 
      sleep(1); 
     } 
    } 
} 
while ($threads > 0) 
{ 
    sleep(1); 
} 

sub check_site 
{ 
    $server = $_[0]; 
    print "$server\n"; 
    $threads--; 
} 

Это дает ошибку после того, как некоторое время:

Невозможно вызвать метод "отрываться" на неопределенное значение в C: \ Perl \ webchecker.pl строка 28, строка 245.

Что вызывает эту ошибку? Я знаю, что это в отрыве, но что я делаю неправильно в своем коде? Windows показывает много свободной памяти, поэтому на компьютере не должно хватать памяти, эта ошибка возникает, даже если я устанавливаю $ maxthreads как минимум 10 или, возможно, даже ниже.

+0

Извините, но этот сайт должен указывать #!/Usr/bin/perl на!/Usr/bin/perl (удаляет первый символ), пожалуйста, проигнорируйте это –

+2

Если это не эксперимент с потоками, рассмотрите Parallel :: ForkManager или Thread :: Queue , – Schwern

ответ

1

Конкретная проблема заключается в том, что thread->create не создает нить, и поэтому возвращается undef. Вы должны проверить значение thr перед вызовом detach, если вы хотите, чтобы ваш код был более надежным.

+0

ОК спасибо, что, похоже, работает, я добавил проверку, если undef и если так спать (1), и повторите попытку, пока он не будет работать, и он перейдет через список только сейчас. –

+0

извините, ошибка произошла позже: panic: попытайтесь скопировать освобожденный скаляр 32c0bb4 в 23b080c в C: \ perl \ webchecker.pl строка 24, строка 15863. Попытка освободить сканер без ссылок: SV 0x32c0bb4, Perl-интерпретатор: 0x3354584. Что вызвало эту ошибку? –

+2

Алиса Возаник, возможно, лучше [открыть новый вопрос] (http://stackoverflow.com/questions/ask) для этой другой проблемы. Вставьте свой код еще раз, а также назовите версию Perl и используемых модулей 'threads'. – daxim

Смежные вопросы