开发者

perl threading problem

开发者 https://www.devze.com 2023-01-03 03:32 出处:网络
I\'m writing a multithreaded website uptime checker in perl, and here is the basic code so far (includes only threading part):

I'm writing a multithreaded website uptime checker in perl, and here is the basic code so far (includes only threading part):

#!/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--;
}

It gives an error after a while:

Can't call method "detach" on an undefined value at C:\perl\webchecker.pl line 28, line 245.

What causes this error? I know it is at detach, but what am I doing wrong in my code? Windows shows lots of free memory, so it should not be the computer running out of memory, this error occur开发者_JAVA百科s even if I set $maxthreads as low as 10 or possibly even lower.


The specific issue is that thread->create is failing to create a thread and so it is returning undef. You should check the value of thr before calling detach if you want your code to be more robust.

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号