我正在使用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行调用未定义值的方法“detach”。
导致此错误的原因是什么?我知道它正在分离,但我的代码中我做错了什么? Windows显示大量可用内存,因此它不应该是计算机内存不足,即使我将$ maxthreads设置为低至10甚至更低,也会发生此错误。
答案 0 :(得分:1)
具体问题是thread->create
无法创建线程,因此它返回undef
。如果您希望代码更强大,则应在致电thr
之前检查detach
的值。