$fetch->() for 1 .. 2;
# or
$fetch->() for 1 .. 3;
# or
$fetch->() for 1 .. 4;
# or
$fetch->();
$fetch->();
####
$fetch->() for 1 .. 1;
# or
$fetch->();
####
### my $end = $delay->begin;
...
### $end->();
####
#!/usr/bin/env perl
use strict;
use warnings;
use feature 'say';
use Mojo::UserAgent;
use Mojo::IOLoop;
say "PID: $$";
my @urls = (
'mojolicious.org/perldoc/Mojo/DOM', 'mojolicious.org/perldoc/Mojo',
'mojolicious.org/perldoc/Mojo/File', 'mojolicious.org/perldoc/Mojo/URL',
'mojolicious.org/perldoc/Mojo/DOM', 'mojolicious.org/perldoc/Mojo',
'mojolicious.org/perldoc/Mojo/File', 'mojolicious.org/perldoc/Mojo/URL',
);
# User agent with a custom name, following up to 5 redirects
my $ua = Mojo::UserAgent->new(max_redirects => 5);
$ua->transactor->name('MyParallelCrawler 1.0');
# Use a delay to keep the event loop running until we are done
my $delay = Mojo::IOLoop->delay;
my $fetch;
$fetch = sub {
my ($fetch_id) = @_;
say "FETCH ID: $fetch_id";
say "PID: $$; URL count: ", 0+@urls, "; URLS: @urls";
# Stop if there are no more URLs
#return unless my $url = shift @urls;
return unless @urls;
my $url = shift @urls;
say "URL (pre delay): $url";
# Fetch the next title
### my $end = $delay->begin;
say "URL (post delay): $url";
$ua->get($url => sub {
my ($ua, $tx) = @_;
say "\$ua->get(): \$ua[$ua] \$tx[$tx]";
say "$url: ", $tx->result->dom->at('title')->text;
### $end->();
# Next request
$fetch->("INNER-$fetch_id");
});
say "AFTER \$ua->get()";
};
# Process two requests at a time
$fetch->($_) for 1 .. 1;
#$fetch->(1);
#$fetch->(2);
$delay->wait;