Skip to content

Instantly share code, notes, and snippets.

@ferki
Created January 26, 2020 22:15
Show Gist options
  • Save ferki/f55dea47cc84143ee48d7ae5afe34f85 to your computer and use it in GitHub Desktop.
Save ferki/f55dea47cc84143ee48d7ae5afe34f85 to your computer and use it in GitHub Desktop.
Parallel task execution with Rex
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