NAME
HealthCheck::Parallel - A HealthCheck that uses parallelization for running checks
VERSION
version v0.1.0
SYNOPSIS
use HealthCheck::Parallel;
my $hc = HealthCheck::Parallel->new(
max_procs => 4, # default
timeout => 120, # default, global timeout in seconds
tempdir => '/tmp', # override Parallel::ForkManager default
child_init => sub { warn "Will run at start of child process check" },
checks => [
sub { sleep 5; return { id => 'slow1', status => 'OK' } },
sub { sleep 5; return { id => 'slow2', status => 'OK' } },
],
);
# Takes 5 seconds to run both checks instead of 10.
my $res = $hc->check;
# These checks will not use parallelization.
$res = $hc->check( max_procs => 0 );
# Neither will these.
$res = $hc->check( max_procs => 1 );
# Override timeout for specific check.
$res = $hc->check( timeout => 60 );
DESCRIPTION
This library inherits HealthCheck so that the provided checks are run in parallel.
METHODS
new
Overrides the "new" in HealthCheck constructor to additionally allow "max_procs" and "timeout" arguments for controlling parallelization and global timeout behavior.
ATTRIBUTES
max_procs
A positive integer (or coderef returning one) specifying the maximum number of processes that should be run in parallel when executing the checks. No parallelization will be used unless given a value that is greater than 1. Defaults to 4.
If provided as a coderef, it will be called at runtime to determine the value, allowing dynamic adjustment:
my $hc = HealthCheck::Parallel->new(
max_procs => sub { int(rand(10)) },
checks => [ ... ],
);
child_init
An optional coderef which will be run when the child process of a check is created. A possible important use case is making sure child processes don't try to make use of STDOUT if these checks are running under FastCGI envrionment:
my $hc = HealthCheck::Parallel->new(
child_init => sub {
untie *STDOUT;
{ no warnings; *FCGI::DESTROY = sub {}; }
},
);
tempdir
Sets the tempdir value to use in Parallel::ForkManager for IPC.
timeout
A positive integer (or coderef returning one) specifying the maximum number of seconds to wait for all parallelized checks to complete. If the timeout is exceeded, all running child processes will be terminated and CRITICAL results will be returned for affected checks. Defaults to 120 seconds.
If provided as a coderef, it will be called at runtime to determine the value, allowing dynamic adjustment:
my $hc = HealthCheck::Parallel->new(
timeout => sub { int(rand(10)) },
checks => [ ... ],
);
Note: The timeout only applies when parallelization is enabled (max_procs > 1). When max_procs is 0 or 1, checks run in the parent process and the timeout is not used.
The timeout is implemented using a non-blocking polling loop instead of using any signal-based timeouts to potentially avoiding conflicting with others.
DEPENDENCIES
Perl 5.10 or higher.
SEE ALSO
AUTHOR
Grant Street Group <developers@grantstreet.com>
COPYRIGHT AND LICENSE
This software is Copyright (c) 2023 - 2025 by Grant Street Group.
This is free software, licensed under:
The Artistic License 2.0 (GPL Compatible)