- ベストアンサー
forkで作れる子プロセス数が限られている
for($i=0;$i<1000;$i++) { if($p=fork) { next; } elsif(defined($p)) { sleep 10000; exit; } else { print("$i\n"); <STDIN>; } } 数十個で子プロセスが生成されなくなります メモリは十分あまってます デスクトップヒープ領域が足りなくなったわけじゃなさそうです どうすればメモリが足りる限り子プロセスを生成できるでしょうか? windows xp avtive perl 5.8.7です。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
forkと同じではないですが、Win32::Processはどうでしょう。 以下のスクリプトは100のプロセスを起動できているみたいです。 D:\@ai\@Perl\Process>test1.pl M 3780 start... 3824 start... 3664 start... 3620 start... 1124 start... #!Perl use Win32::Process; use Win32; sub ErrorReport{ print Win32::FormatMessage( Win32::GetLastError() ); } my $param = shift; my @proc; if ($param eq "M") { for (1..100) { my $ProcessObj; Win32::Process::Create($ProcessObj, "C:\\Perl\\bin\\perl.exe", "perl test1.pl", 0, NORMAL_PRIORITY_CLASS, ".")|| die ErrorReport(); push @proc => $ProcessObj } } else { print "$$ start...\n"; sleep 60; print "$$ end\n"; } __END__
その他の回答 (3)
- tatsu99
- ベストアンサー率52% (391/751)
>具体的な解決方法はないのでしょうか? この制約は1つのプロセスが生成出来るプロセスの上限を64にしているところからきていると思います。 もし、この64を他の値に変更する方法がない場合、以下の方法を採られてはいかがでしょうか。 1案、プロセスを生成するスクリプトをプロセスを複数立ち上げる。nプロセス立ち上げれば、n×64個生成できます。 2案、子プロセスが更に、親プロセスと同じ事(プロセスの生成)を行うようにする。
- guci-ok
- ベストアンサー率33% (49/146)
64(に近い数字)が最大です。 これは、使われているWindowsのAPIの制限です。 (今、すぐにこのAPIの名前が出てきませんが) Perl-Win32のメーリングリストで流れていました。
- asuca
- ベストアンサー率47% (11786/24626)
プロセス表の利用者のエントリ数の上限によって制限されているのではなかったかと思います。
補足
ありがとうございます。
補足
ありがとうございます 具体的な解決方法はないのでしょうか?