проблема с Perl - PullRequest
       1

проблема с Perl

3 голосов
/ 14 июня 2010

Я пишу многопоточное средство проверки работоспособности веб-сайта на 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--;
}

Через некоторое время выдает ошибку:

Не удается вызвать метод «detach» для неопределенного значения в C: \ perl \ webchecker.pl, строка 28, строка 245.

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

1 Ответ

1 голос
/ 14 июня 2010

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

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