Swoole Process比pcntl稳定的PHP多进程

2018-04-02  本文已影响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

上一篇下一篇

猜你喜欢

热点阅读