zoukankan      html  css  js  c++  java
  • swoole多进程操作

     

    多个任务同时执行

    将顺序执行的任务,转化为并行执行(任务在逻辑上可以并行执行)

    比如,我们要对已知的用户数据进行判断,是否需要发送邮件和短信,如果需要发送则发送。

    不使用多进程时,我们首先判断是否发送邮件,如果需要则发送;然后再判断是否需要发送短信,如果需要则发送。如果发送邮件耗时2s,发送短信耗时2s,那么我们完成任务大概需要4s左右的时间。

    如果我们使用多线程的话,可以开两个线程,一个用于处理邮件,一个用于处理短信,则耗时一共需要2s左右,处理时间缩短了一半。

    <?php
    /**
     * Created by PhpStorm.
     * User: zhezhao
     * Date: 2016/10/20
     * Time: 10:37
     */
    $info = array(
        "sendmail"=>1,
        "mailto"=>"12345@qq.com",
        "sendsms"=>1,
        "smsto"=>"123456"
    );
    echo "start:".date("Y-m-d H:i:s").PHP_EOL;
    $mail_process = new swoole_process('sendMail',true);
    $mail_process->start();
    $sms_process = new swoole_process('sendSMS',true);
    $sms_process->start();
    //主进程输出子进程范围内容
    echo $mail_process->read();
    echo PHP_EOL;
    echo $sms_process->read();
    echo PHP_EOL;
    echo "end:".date("Y-m-d H:i:s").PHP_EOL;
    //并行函数
    function sendMail(swoole_process $worker){
        global $info;
        if($info['sendmail']==1){
            sleep(2);
            $worker->write("send mail to ".$info['mailto']);
        }
    }
    function sendSMS(swoole_process $worker){
        global $info;
        if($info['sendmail']==1){
            sleep(2);
            $worker->write("send sms to ".$info['smsto']);
        }
    }

     

    大任务划分成多个小任务

    将循环执行的任务,划分为多个进程执行,提高工作效率

    假设我们现在有一个通过curl抓取网页内容的需求,需要抓取10个网页,url地址通过数组读取,每个curl耗时2s。如果我们通过for循环来抓取这10个网页,需要耗时20s,使用多进程我们可以将任务划分成5份,分别由5个进程执行,每个进程抓取2个url,并发执行,共耗时4s,效率提高5倍。

    <?php
    /**
     * Created by PhpStorm.
     * User: zhezhao
     * Date: 2016/10/20
     * Time: 10:51
     */
    $url_arr = array();
    for ($i=0;$i<10;$i++){
        $url_arr[] = "www.baidu.com?wd=".$i;
    }
    echo "start:".date("Y-m-d H:i:s").PHP_EOL;
    $workers = array();
    for ($i=0;$i<5;$i++){
        $process = new swoole_process('getContents',true);
        $process->start();
        $process->write($i);
        $workers[] = $process;
    }
    //主进程数据结果
    foreach ($workers as $process){
        echo $process->read();
        echo PHP_EOL;
    }
    echo "end:".date("Y-m-d H:i:s").PHP_EOL;
    function getContents(swoole_process $worker){
        $i = $worker->read();
        global $url_arr;
        $res1 = execCurl($url_arr[($i*2)]);
        $res2 = execCurl($url_arr[($i*2+1)]);
        echo $res1.PHP_EOL.$res2;
    }
    function execCurl($url){
        sleep(2);
        return "handle ".$url." finished";
    }

    总结

    以上两种情况,本质上都是将逻辑上没有先后关系的任务,用多个进程程并发执行,提高效率。

    php机制本身不提供多线程的操作,ptcl扩展提供了php操作linux多进程的接口。

    个人感觉swoole的多进程process方法更加方便一些。

  • 相关阅读:
    Anagram
    HDU 1205 吃糖果(鸽巢原理)
    Codeforces 1243D 0-1 MST(补图的连通图数量)
    Codeforces 1243C Tile Painting(素数)
    Codeforces 1243B2 Character Swap (Hard Version)
    Codeforces 1243B1 Character Swap (Easy Version)
    Codeforces 1243A Maximum Square
    Codeforces 1272E Nearest Opposite Parity(BFS)
    Codeforces 1272D Remove One Element
    Codeforces 1272C Yet Another Broken Keyboard
  • 原文地址:https://www.cnblogs.com/houdj/p/8886520.html
Copyright © 2011-2022 走看看