ここでは、Parallel :: ForkManagerを使用するプログラムの欠点を示します。これは、Mojo :: UserAgentに送信するURLを収集するpgsqlクエリのサイズに応じて、200プロセス(時には約30)で停止するようです。どこか厳しい制限があるようですね?私はこれらの制限に遭遇しないようにこれを書くための良い方法がありますか?稼働しているマシンは16のCPUと128GBのメモリを持っているため、Mojo :: UserAgentのタイムアウト(通常は2秒)後に200を超える処理が確実に実行されます。メモリ、CPU使用量に応じて、200以上のプロセスをフォークできません。時には、少なくなります。
use Parallel::ForkManager;
use Mojo::Base-strict;
use Mojo::UserAgent;
use Mojo::Pg;
use Math::Random::Secure qw(rand irand);
use POSIX qw(strftime);
use Socket;
use GeoIP2::Database::Reader;
use File::Spec::Functions qw(:ALL);
use File::Basename qw(dirname);
use feature 'say';
$max_kids = 500;
sub do_auth {
...
push(@url, $authurl);
}
do_auth();
my $pm = Parallel::ForkManager->new($max_kids);
LINKS:
foreach my $linkarray (@url) {
$pm->start and next LINKS; # do the fork
my $ua = Mojo::UserAgent->new(max_redirects => 5, timeout => $timeout);
$ua->get($url);
$pm->finish;
}
$pm->wait_all_children;
16個のCPUしか持っていないと、200個のプロセスをフォークするのはなぜですか? – ThisSuitIsBlackNot
@ThisSuitIsBlackNot、ほとんどがHTTPレスポンスを待っているのでスリープしています。 – ikegami
@ajmcello、あなたは、それを行うプロセス全体を作成せずに複数のリクエストを実行できるクライアントを使用する方が良いでしょう(例:[Net :: Curl :: Multi](http://search.cpan.org/perldoc? Net :: Curl :: Multi))。 – ikegami