Created
January 26, 2020 22:15
-
-
Save ferki/f55dea47cc84143ee48d7ae5afe34f85 to your computer and use it in GitHub Desktop.
Parallel task execution with Rex
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
use strict; | |
use warnings; | |
use Rex -feature => [ '1.4', 'exec_autodie' ]; | |
use Parallel::Subs; | |
use Parallel::Forker; | |
desc 'Sleep for some time'; | |
task 'rexsleep', sub { | |
my $params = shift; | |
my $duration = $params->{duration} // 1; | |
say "Sleeping ($duration)"; | |
sleep $duration; | |
say "Done!"; | |
}; | |
desc 'Sleep sequentially'; | |
task 'sequential', sub { | |
run_task 'rexsleep', params => { duration => 1 }; | |
run_task 'rexsleep', params => { duration => 1 }; | |
run_task 'rexsleep', params => { duration => 1 }; | |
}; | |
desc 'Sleep a lot with Parallel::Subs'; | |
task 'parallel_subs', sub { | |
my $p = Parallel::Subs->new(); | |
$p->add( sub { run_task 'rexsleep', params => { duration => 3 } } ); | |
$p->add( sub { run_task 'rexsleep', params => { duration => 3 } } ); | |
$p->add( sub { run_task 'rexsleep', params => { duration => 3 } } ); | |
$p->wait_for_all; | |
}; | |
desc 'Sleep a lot with Parallel::Forker, then sleep a bit more'; | |
task 'parallel_forker', sub { | |
my $forker = Parallel::Forker->new( use_sig_child => 1 ); | |
local $SIG{CHLD} = sub { Parallel::Forker::sig_child($forker); }; | |
local $SIG{TERM} = sub { | |
$forker->kill_tree_all('TERM') if $forker && $forker->in_parent; | |
die "Quitting...\n"; | |
}; | |
$forker->schedule( | |
run_on_start => sub { run_task 'rexsleep', params => { duration => 3 } }, | |
label => 'grouped', | |
); | |
$forker->schedule( | |
run_on_start => sub { run_task 'rexsleep', params => { duration => 3 } }, | |
label => 'grouped', | |
); | |
$forker->schedule( | |
run_on_start => sub { run_task 'rexsleep', params => { duration => 3 } }, | |
label => 'grouped', | |
); | |
$forker->schedule( | |
run_on_start => sub { run_task 'rexsleep', params => { duration => 1 } }, | |
label => 'single', | |
run_after => ['grouped'], | |
); | |
$forker->ready_all; | |
$forker->wait_all; | |
}; | |
1; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment