Manager class for Parallel processes.
This class will manage the workers and make sure all processes are executed in parallel and not too many at the same time.
category |
DocBlox |
---|---|
package |
Parallel |
author |
Mike van Riel mike.vanriel@naenius.com |
license | |
link |
__construct(array $input = array(), integer $flags, string $iterator_class = "ArrayIterator")
array
Input for the array object.
integer
flags for the array object.
string
Iterator class for this array object.
addWorker(\DocBlox_Parallel_Worker $worker) : self
checkRequirements() : boolean
boolean
execute() : void
This method loops through the list of workers and tries to fork as many times as the ProcessLimit dictates at the same time.
forkAndRun(\DocBlox_Parallel_Worker $worker, array &$processes) : void
This is the really tricky part of the forking mechanism. Here we invoke pcntl_fork and either execute the forked process or deal with the parent's process based on in which process we are.
To fully understand what is going on here it is recommended to read the PHP manual page on pcntl_fork and associated articles.
If there are more workers than may be ran simultaneously then this method will wait until a slot becomes available and then starts the next worker.
throws |
if we are unable to fork. |
---|
array
getProcessLimit() : integer
integer
isRunning() : boolean
boolean
offsetSet(integer $index, \DocBlox_Parallel_Worker $newval) : void
This method will prepare a worker to be executed in parallel once the execute method is invoked. A fluent interface is provided so that you can chain multiple workers in one call.
Example:
$cb1 = function() { var_dump('a'); sleep(1); }; $cb2 = function() { var_dump('b'); sleep(1); };
$mgr = new DocBlox_Parallel_Manager(); $mgr->setProcessLimit(2)
->addWorker(new DocBlox_Parallel_Worker($cb1))
->addWorker(new DocBlox_Parallel_Worker($cb2))
->execute();
see | \DocBlox_Parallel_Manager::execute() |
---|---|
throws |
if this method is invoked while the
if the provided element is not of type
|
integer
The key for this worker.
setProcessLimit(integer $process_limit) : self
A fluent interface is provided so that you can chain multiple workers in one call.
see |
\DocBlox_Parallel_Manager::addWorker()
for an example |
---|
integer
The limit, minimum of 1
self
startExecution() : array<mixed,integer>
If forking is not available because library requirements are not met than the list of workers is processed in series and a E_USER_NOTICE is triggered.
array<mixed,integer>
stopExecution(array &$processes) : void
array
process_limit : integer
var |
The maximum number of processes to run simultaneously |
---|
integer
is_running : boolean
var |
Tracks whether this manager is currently executing |
---|
boolean