swoole 4.4.5 process 报错 must be forked outside the coroutine ?

<?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();
阅读 4.5k
1 个回答

在协程环境下Timer::tick回调中会自动创建一个协程,在协程环境中是不能够fork子进程的

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题