看看swoole多進(jìn)程操作

看看swoole多進(jìn)程操作

多個(gè)任務(wù)同時(shí)執(zhí)行

將順序執(zhí)行的任務(wù),轉(zhuǎn)化為并行執(zhí)行(任務(wù)在邏輯上可以并行執(zhí)行)

比如,我們要對(duì)已知的用戶數(shù)據(jù)進(jìn)行判斷,是否需要發(fā)送郵件和短信,如果需要發(fā)送則發(fā)送。

不使用多進(jìn)程時(shí),我們首先判斷是否發(fā)送郵件,如果需要?jiǎng)t發(fā)送;然后再判斷是否需要發(fā)送短信,如果需要?jiǎng)t發(fā)送。如果發(fā)送郵件耗時(shí)2s,發(fā)送短信耗時(shí)2s,那么我們完成任務(wù)大概需要4s左右的時(shí)間。

如果我們使用線程的話,可以開兩個(gè)線程,一個(gè)用于處理郵件,一個(gè)用于處理短信,則耗時(shí)一共需要2s左右,處理時(shí)間縮短了一半。

推薦(免費(fèi)):swoole

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

看看swoole多進(jìn)程操作

大任務(wù)劃分成多個(gè)小任務(wù)

循環(huán)執(zhí)行的任務(wù),劃分為多個(gè)進(jìn)程執(zhí)行,提高工作效率

假設(shè)我們現(xiàn)在有一個(gè)通過cURL抓取網(wǎng)頁(yè)內(nèi)容的需求,需要抓取10個(gè)網(wǎng)頁(yè),url地址通過數(shù)組讀取,每個(gè)curl耗時(shí)2s。如果我們通過for循環(huán)來抓取這10個(gè)網(wǎng)頁(yè),需要耗時(shí)20s,使用多進(jìn)程我們可以將任務(wù)劃分成5份,分別由5個(gè)進(jìn)程執(zhí)行,每個(gè)進(jìn)程抓取2個(gè)url,并發(fā)執(zhí)行,共耗時(shí)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(&#39;getContents&#39;,true);    $process->start();????$process-&gt;write($i);????$workers[]?=?$process; }//主進(jìn)程數(shù)據(jù)結(jié)果foreach?($workers?as?$process){????echo?$process-&gt;read();????echo?PHP_EOL; }echo?"end:".date("Y-m-d?H:i:s").PHP_EOL;function?getContents(swoole_process?$worker){ ????$i?=?$worker-&gt;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"; }

看看swoole多進(jìn)程操作

總結(jié)

以上兩種情況,本質(zhì)上都是將邏輯上沒有先后關(guān)系的任務(wù),用多個(gè)進(jìn)程程并發(fā)執(zhí)行,提高效率。

php機(jī)制本身不提供多線程的操作,ptcl擴(kuò)展提供了php操作linux多進(jìn)程的接口

個(gè)人感覺swoole的多進(jìn)程process方法更加方便一些。

? 版權(quán)聲明
THE END
喜歡就支持一下吧
點(diǎn)贊13 分享