2010-06-13 63 views
3

我用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或甚至更低,也会发生此错误。

+0

对不起,但本网站转换#!/ usr/bin/perl to!/ usr/bin/perl(删除第一个字符)请忽略 – 2010-06-13 21:45:24

+2

除非这是一个线程实验,否则考虑Parallel :: ForkManager或Thread :: Queue 。 – Schwern 2010-06-13 23:39:08

回答

1

具体问题是thread->create无法创建线程,因此它返回undef。如果你希望你的代码更健壮,你应该在调用detach之前检查thr的值。

+0

好的谢谢,似乎工作,我添加检查,如果undef,如果是这样睡觉(1),再试一次,直到它的工作,它现在通过列表就好了 – 2010-06-13 22:33:29

+0

对不起,后来发生错误: 恐慌:尝试复制释放标量32c0bb4到23b080c在C:\ perl \ webchecker.pl行24,行15863. 尝试释放未引用标量:SV 0x32c0bb4,Perl解释器:0x3354584。 是什么导致了这个错误? – 2010-06-13 22:40:58

+2

Alice Wozownik,对于这个不同的问题,最好[打开一个新问题](http://stackoverflow.com/questions/ask)。再次粘贴你的代码,并且命名Perl和使用的'threads'模块的版本。 – daxim 2010-06-14 05:33:19