2010-06-13 61 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