$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;