Я пишу многопоточный веб-сайт безотказной работы проверки в 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 или, возможно, даже ниже.
Извините, но этот сайт должен указывать #!/Usr/bin/perl на!/Usr/bin/perl (удаляет первый символ), пожалуйста, проигнорируйте это –
Если это не эксперимент с потоками, рассмотрите Parallel :: ForkManager или Thread :: Queue , – Schwern