<?php
class Process{
private $process;
private $process_list=[];
private $process_used=[];
private $min=3;
private $max=6;//最大进程数
private $current_num=0;//当前进程数
public function __construct()
{
$this->process=new swoole_process(array($this,'run'),false,2);
$this->process->start();
swoole_process::wait();
}
public function run()
{
for($i=0;$i<$this->min;$i++){
$process = new swoole_process(array($this,'task_run'),false,2);
$pid = $process->start();
$this->process_list[$pid]=$process;
$this->process_used[$pid]=0;
}
$this->current_num=$this->min;
foreach ($this->process_list as $process){
swoole_event_add($process->pipe,function ($pipe) use($process){
$data = $process->read();
var_dump(".........".$data);
$this->process_used[$data]=0;
});
}
swoole_timer_tick(1000,function ($timer_id){
static $index = 0;
$index=$index+1;
$flag = true;
foreach ($this->process_used as $pid=>$used){
if($used==0){
$flag = false;
$this->process_used[$pid]=1;
$this->process_list[$pid]->write($index."hello");
break;
}
}
if($flag && $this->current_num<$this->max){
$process = new swoole_process(array($this,'task_run'),false,2);
$pid = $process->start();
$this->process_list[$pid]=$process;
$this->process_used[$pid]=1;
$this->process_list[$pid]->write($index."hello");
$this->current_num++;
}
if($index==10){
foreach ($this->process_list as $process){
$process->write("exit");
}
swoole_timer_clear($timer_id);
$this->process->exit();
}
});
}
public function task_run($worker){
swoole_event_add($worker->pipe,function($pipe) use ($worker){
$data = $worker->read();
var_dump($worker->pid.":".$data);
if($data == 'exit'){
$worker->exit();
exit;
}
sleep(5);
$worker->write("".$worker->pid);
});
}
}
new Process();
在协程环境下Timer::tick回调中会自动创建一个协程,在协程环境中是不能够fork子进程的