Вот несколько вариантов использования программы Parallel :: ForkManager. Кажется, он останавливается на 200 попытках, иногда около 30, в зависимости от размера запроса pgsql, который собирает URL-адреса для отправки в Mojo :: UserAgent. Кажется, где-то есть какие-то жесткие ограничения? Есть ли лучший способ написать это, чтобы я не сталкивался с этими ограничениями? Машина, на которой работает компьютер, имеет 16 процессоров и 128 ГБ памяти, поэтому она может запустить более 200 процессов, которые будут умирать после таймаута Mojo :: UserAgent, который обычно составляет 2 секунды.Невозможно разблокировать более 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;
Зачем вам fork 200 обрабатывать, когда у вас только 16 процессоров ??? – ThisSuitIsBlackNot
@ThisSuitIsBlackNot, потому что большинство спали, ожидая ответа HTTP. – ikegami
@ajmcello, вам было бы лучше использовать клиент, способный выполнять несколько запросов, не создавая для этого весь процесс (например, [Net :: Curl :: Multi] (http://search.cpan.org/perldoc? Net :: Curl :: Multi)). – ikegami