2012-04-11 12 views
2

私は奇妙な問題に直面しています。フォークのプロセスは、Perlがそのような制限を定義していませんが、ほとんどのオペレーティングシステムが行う以上64perlでforkできるプロセスの数に制限はありますか?

sub create_process() 
{ 
    my $child_pid; 
    my @nsitr; 

    my $i = 0; 

    foreach my $domain (@domains) 
    { 
     @nsitr = @nameservers; 
     open my $dnsfh, '>', $outputfile or die "Unable to open $outputfile - $!"; 
     foreach my $ns (@nameservers) 
     { 
      print "Forking child $i\n"; 
      defined($child_pid = fork()) or (die "Unable to fork a new process" && next); 
      $i++; 
      if($child_pid == 0) 
      { 
       &resolve_dns($dnsfh, $domain, $ns); 
       exit; 
      } 

     } 
     close $dnsfh; 
    } 
} 

出力

... 
... 
Forking child 60 
Forking child 61 
Forking child 62 
Forking child 63 
Forking child 64 
Forking child 64 
Forking child 64 
Forking child 64 
Forking child 64 
... 
... 

答えて

5

が増加されていません。子供を収穫するにはwaitpidを使用するか、Unixライクなシステムでは、sigactionPOSIXモジュールから)を使用して、SA_NOCLDWAITフラグを持つSIGCHLDのフラグを無視してシステムを自動的に収穫させることができます。 (LinuxはあなたがSA_NOCLDWAITを省略させてしまっていますが、とにかくそれを使用する必要があります。)

+0

私はwaitpidを使用しますが、それは174または226で停止します。私は4000プロセスをフォークする必要があります。 – cppcoder

+0

「または」?プログラム上の他の制約を探します。コンピュータリソースはまったく無制限ではありません。あなたはおそらく*何かを使い果たしているかもしれません。私はそれが何であるかを言うには十分な情報がありません。そして、私はまだあなたがそれをやっているOSが分からないので、限界がどんなものであろうとも考えていません。 – geekosaur

2

あなたはパラレル検索を行いたい場合は、あなたがNet::DNSAnyEvent::DNSをチェックアウトに含まれdemo scriptを使用することができます。

後者は、このモジュールは、DNSの便利な機能の数だけでなく、完全に非同期で高性能純粋-perlのスタブリゾルバの両方を提供

提供します。

私はそれを使用していないが、IO::Lambda::DNSは、パラレルクエリを行うことができるようになる。これらのモジュールを使用して

# parallel async queries 
    lambda { 
     for my $site (map { "www.$_.com" } qw(google yahoo perl)) { 
     context $site, 'MX', timeout => 0.25; 
     dns { print shift-> string if ref($_[0]) } 
     } 
    }-> wait; 

は手でフォークを管理することが好ましいかもしれません。


あなたのご意見に基づいて、私はあなたが何を言おうとしていたか誤解している可能性があります。多分これは役立ちます:

#!/usr/bin/env perl 

use strict; use warnings; 

use AnyEvent::DNS; 
use AnyEvent::Socket; 
use YAML; 

my %nameservers = (
    'Google' => '8.8.4.4', 
    'Dnsadvantage' => '156.154.71.1', 
    'OpenDNS' => '208.67.222.222', 
    'Norton' => '198.153.194.1', 
    'Verizon' => '4.2.2.4', 
    'ScrubIt' => '207.225.209.66', 
); 

for my $ip (values %nameservers) { 
    $ip = AnyEvent::DNS->new(
     server => [ parse_address($_) ], 
     timeout => [3], 
    ); 
} 

my @domains = qw(example.com cnn.com bing.com); 

my $cv = AnyEvent->condvar; 
for my $domain (@domains) { 
    for my $ns (keys %nameservers) { 
     $cv->begin; 
     $nameservers{$ns}->resolve(
      $domain, 'a', sub { 
       $cv->end; 
       print Dump { $ns => [ @{$_[0]}[0,4] ] }; 
      } 
     ); 
    } 
} 

$cv->recv; 

出力:あなたがUnixシステムのいくつかの種類にしている場合は

--- 
ScrubIt: 
    - example.com 
    - 192.0.43.10 
--- 
ScrubIt: 
    - cnn.com 
    - 157.166.226.26 
--- 
Norton: 
    - example.com 
    - 192.0.43.10 
--- 
OpenDNS: 
    - example.com 
    - 192.0.43.10 
--- 
Dnsadvantage: 
    - example.com 
    - 192.0.43.10 
--- 
Verizon: 
    - example.com 
    - 192.0.43.10 
--- 
Google: 
    - example.com 
    - 192.0.43.10 
--- 
ScrubIt: 
    - bing.com 
    - 65.52.107.149 
--- 
Norton: 
    - cnn.com 
    - 157.166.255.18 
--- 
OpenDNS: 
    - cnn.com 
    - 157.166.255.19 
--- 
Dnsadvantage: 
    - cnn.com 
    - 157.166.226.25 
--- 
Verizon: 
    - cnn.com 
    - 157.166.226.26 
--- 
Google: 
    - cnn.com 
    - 157.166.255.18 
--- 
Norton: 
    - bing.com 
    - 65.52.107.149 
--- 
OpenDNS: 
    - bing.com 
    - 65.52.107.149 
--- 
Dnsadvantage: 
    - bing.com 
    - 65.52.107.149 
--- 
Verizon: 
    - bing.com 
    - 65.52.107.149 
--- 
Google: 
    - bing.com 
    - 65.52.107.149
+0

各ネームサーバーを1つずつ照会する必要があります。なぜなら、どのサーバーでも成功した解像度に関係なく、すべてのサーバーに照会したいからです。 – cppcoder

0

は、あなたがuse threadsモジュールの代わりに、フォークにしたいことがあります。実際には、いくつかの面ではさらに重く、いくつかの余分なハウスキーピングが必要になるかもしれませんが、これによってフォークされたプロセス制限を超えることができます。しかし、スレッドを大量に作成することを妨げる他の制限があるかもしれません。

関連する問題