67 lines
1.4 KiB
PHP
67 lines
1.4 KiB
PHP
<?php
|
|
/**
|
|
* Created by PhpStorm.
|
|
* User: Jenner
|
|
* Date: 2015/11/2
|
|
* Time: 17:45
|
|
*/
|
|
|
|
namespace Jenner\SimpleFork;
|
|
|
|
|
|
/**
|
|
* fixed pool
|
|
*
|
|
* @package Jenner\SimpleFork
|
|
*/
|
|
class FixedPool extends AbstractPool
|
|
{
|
|
/**
|
|
* @var int max process count
|
|
*/
|
|
protected $max;
|
|
|
|
/**
|
|
* @param int $max
|
|
*/
|
|
public function __construct($max = 4)
|
|
{
|
|
$this->max = $max;
|
|
}
|
|
|
|
public function execute(Process $process)
|
|
{
|
|
Utils::checkOverwriteRunMethod(get_class($process));
|
|
|
|
if ($this->aliveCount() < $this->max && !$process->isStarted()) {
|
|
$process->start();
|
|
}
|
|
array_push($this->processes, $process);
|
|
}
|
|
|
|
/**
|
|
* wait for all process done
|
|
*
|
|
* @param bool $block block the master process
|
|
* to keep the sub process count all the time
|
|
* @param int $interval check time interval
|
|
*/
|
|
public function wait($block = false, $interval = 100)
|
|
{
|
|
do {
|
|
if ($this->isFinished()) {
|
|
return;
|
|
}
|
|
parent::wait(false);
|
|
if ($this->aliveCount() < $this->max) {
|
|
foreach ($this->processes as $process) {
|
|
if ($process->isStarted()) continue;
|
|
$process->start();
|
|
if ($this->aliveCount() >= $this->max) break;
|
|
}
|
|
}
|
|
$block ? usleep($interval) : null;
|
|
} while ($block);
|
|
}
|
|
|
|
} |