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 occurs 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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With