美文网首页
Swoole Process比pcntl稳定的PHP多进程

Swoole Process比pcntl稳定的PHP多进程

作者: 大胡子商人 | 来源:发表于2018-04-02 10:58 被阅读275次

    模拟场景:

    假设处理一个任务需要1s,共有7个任务

    1.按照php传统的同步编程方法:

    <?php
        //记录程序开始执行时间
        echo "start-time : ".date('Ymd H:i:s').PHP_EOL;
        //定义任务列表
        $arr = [
            'task 1',
            'task 2',
            'task 3',
            'task 4',
            'task 5',
            'task 6',
            'task 7',
        ];
        //执行任务
        foreach($arr as $v){
            echo doWorker($v);
        }
        //任务执行结束
        echo "all worker finished".PHP_EOL;
        echo "start-time : ".date('Ymd H:i:s').PHP_EOL;
        //模拟执行任务方法
        function doWorker($worker){
            sleep(1);
            return $worker.' is finished'.PHP_EOL;
        }
    

    测试结果:

    image

    2.swoole多进程:

    <?php
        //记录程序开始执行时间
        echo "start-time : ".date('Ymd H:i:s').PHP_EOL;
        //用来存放进程列表的数组
        $workers = [];
        //定义任务列表
        $arr = [
            'task 1',
            'task 2',
            'task 3',
            'task 4',
            'task 5',
            'task 6',
            'task 7',
        ];
        //根据任务数量创建对应的子进程
        for($i=0;$i<count($arr);$i++){
            $process = new swoole_process(function(swoole_process $process) use($arr,$i){
                //每个子进程执行任务
                $res = doWorker($arr[$i]);
                //将处理结果写入管道
                $process->write($res);
            },true);
            //开启进程
            $pid = $process->start();
            //将进程存到进程列表中
            $workers[$pid] = $process;
        }
        //遍历进程列表
        foreach ($workers as $worker){
            //从管道中取出每个进程的处理结果
            $res = $worker->read();
            //关闭子进程
            $worker->wait(false);
            echo $res;
        }
        echo "all worker finished".PHP_EOL;
        echo "end-time : ".date('Ymd H:i:s').PHP_EOL;
    
        function doWorker($worker){
            sleep(1);
            return $worker.' is finished'.PHP_EOL;
        }
    

    测试结果:

    image

    结论:swoole多进程处理方式是为对应任务创建多个子进程并行处理,所以处理时间上个单个任务相差无几.具体使用方法要看实际应用场景而定,这里只做示例.

    参考:https://wiki.swoole.com/wiki/page/p-process.html

    相关文章

      网友评论

          本文标题:Swoole Process比pcntl稳定的PHP多进程

          本文链接:https://www.haomeiwen.com/subject/gbpthftx.html