成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

swoole教程第一節(jié):進(jìn)程管理模塊(Process)-上

Towers / 3545人閱讀

摘要:當(dāng)子進(jìn)程都完成了,主進(jìn)程開始繼續(xù)業(yè)務(wù)。是子進(jìn)程的句柄子進(jìn)程句柄向自己管道里寫內(nèi)容子進(jìn)程句柄從自己的管道里面讀取信息這里是子進(jìn)程哦貼上運(yùn)行結(jié)果喔,通訊是這樣的。我們?cè)倏纯磩?chuàng)建進(jìn)程時(shí)第二個(gè)參數(shù)的說明,重定向子進(jìn)程的標(biāo)準(zhǔn)輸入和輸出。

進(jìn)程管理模塊

介紹看這里 swoole的process
大家可以先看看自己的swoole版本,在命令行里面敲

  

php --ri swoole

更多的php命令行使用,大家學(xué)習(xí) php命令行參數(shù)
ok 我們直奔主題
怎么用

多進(jìn)程的創(chuàng)建

不多說,直接上代碼

start();
    echo PHP_EOL . $pid;//
}
function callback_function_we_write(swoole_process $worker){
    echo  PHP_EOL;
    var_dump($worker);
    echo  PHP_EOL;
}

運(yùn)行結(jié)果如下

5445
object(swoole_process)#1 (3) {
  ["pipe"]=>
  int(3)
  ["callback"]=>
  string(26) "callback_function_we_write"
  ["pid"]=>
  int(5445)
}


5446
object(swoole_process)#2 (3) {
  ["pipe"]=>
  int(5)
  ["callback"]=>
  string(26) "callback_function_we_write"
  ["pid"]=>
  int(5446)
}

可以看到,我們使用 new swoole_process 創(chuàng)建進(jìn)程,這里需要一個(gè)參數(shù),也就是回調(diào)函數(shù)
當(dāng)我們使用 $process->start()執(zhí)行后,返回這個(gè)進(jìn)程的pid ,也就是 $pid.
此時(shí)子進(jìn)程啟動(dòng),調(diào)用回調(diào)函數(shù),并傳一個(gè)參數(shù) 也就是 swoole_process 類型的 $worker
我故意輸出了 $worker 看看里面有什么,結(jié)果有三個(gè)屬性

  

pipe 進(jìn)程的管道id 這個(gè)等說道進(jìn)程間通信的時(shí)候再聊
pid 就是當(dāng)前子進(jìn)程的 pid 啦
callback 這個(gè)是我們自己寫的回調(diào)函數(shù)名

到這里,我們就可以用多進(jìn)程玩耍了,
比如,我們可以測(cè)試多進(jìn)程的運(yùn)行速度

start();
}

function callback_function_we_write(swoole_process $worker){
    for($i=0;$i<100000000;$i++){}
    echo PHP_EOL . time() ; 
}

我本機(jī)運(yùn)行結(jié)果

  

1435563435 // 開始時(shí)間
1435563438 //進(jìn)程1 結(jié)束時(shí)間
1435563440 //進(jìn)程2 結(jié)束時(shí)間
1435563440 //進(jìn)程3 結(jié)束時(shí)間

算三次 用了5s (其實(shí)一般是4s)

再玩一次



我本機(jī)運(yùn)行結(jié)果

  

1435563704
1435563712

這次用了8s

做了這些,我想說明一個(gè)問題

  

并不是說 單進(jìn)程 要花8s 做完的活,我們用3個(gè)進(jìn)程就能將時(shí)間縮小三倍了

嘛,因?yàn)檫@是我以前的誤區(qū)

多進(jìn)程還可以這樣玩

start();
    sleep(2);
}

 while(1){
            $ret = swoole_process::wait();
            if ($ret){// $ret 是個(gè)數(shù)組 code是進(jìn)程退出狀態(tài)碼,
                $pid = $ret["pid"];
                echo PHP_EOL."Worker Exit, PID=" . $pid . PHP_EOL;
            }else{
                break;
            }
}

function methodOne(swoole_process $worker){// 第一個(gè)處理
    echo $worker->callback .PHP_EOL;
}

function methodTwo(swoole_process $worker){// 第二個(gè)處理
    echo $worker->callback .PHP_EOL;
}

function methodThree(swoole_process $worker){// 第三個(gè)處理
    echo $worker->callback .PHP_EOL;
}

我多加的sleep是為了運(yùn)行時(shí)看得更清楚,你也可以去掉
這里我使用了 swoole_process::wait() 詳解
目的是當(dāng)子進(jìn)程結(jié)束后,主進(jìn)程能夠知道。

我們來想一個(gè)情景
過節(jié)了,媽媽要做飯,一看廚房里缺了 油,鹽,糖,味精,十三香。于是吩咐兒子去小賣部買點(diǎn)回來。廚房這邊也不能閑著,老媽要繼續(xù)洗菜,切菜。等到調(diào)料買回來了,菜也洗好,切好了,開始炒,這邊炒好了一個(gè)菜,就要立刻送到餐桌上。

這個(gè)情景里面,顯然使用了多進(jìn)程,并且各進(jìn)程做的不是同樣的事情。當(dāng)子進(jìn)程都完成了,主進(jìn)程開始繼續(xù)業(yè)務(wù)。

現(xiàn)在有了一個(gè)問題,就拿上面的情景來說,兒子去買調(diào)味料,如果發(fā)現(xiàn)鹽沒有了,或者錢不夠了怎么辦,如何與媽媽聯(lián)系呢? 這就是下面要說的 進(jìn)程間的通信

進(jìn)程間的通信

Process 的通信方式有兩種

  

管道
swoole_process->write(string $data);
swoole_process->read(int $buffer_size=8192);

消息隊(duì)列
swoole_process->useQueue();
swoole_process->push(string $data);
swoole_process->pop(int $maxsize = 8192);

我們先說說管道

管道通訊

這里我們要再次的提及進(jìn)程的創(chuàng)建 new swoole_process
大家請(qǐng)看這里 進(jìn)程的創(chuàng)建
第一個(gè)參數(shù)是回調(diào)函數(shù),不說了
第二個(gè)參數(shù)含義等會(huì)我會(huì)結(jié)合例子來說
第三個(gè)參數(shù)是默認(rèn)的 true,意思是創(chuàng)建管道,大家還記得回調(diào)函數(shù)里我特意將$worker輸出看到的內(nèi)容嗎?

object(swoole_process)#1 (3) {
  ["pipe"]=>
  int(3)
  ["callback"]=>
  string(26) "callback_function_we_write"
  ["pid"]=>
  int(5445)
}

關(guān)鍵是這里的 pipe 這個(gè)就是本進(jìn)程的管道id
我們可以這樣理解

  

每次創(chuàng)建一個(gè)進(jìn)程后,就會(huì)隨之創(chuàng)建一個(gè)管道,主進(jìn)程想和哪一個(gè)進(jìn)程通信,就向那個(gè)進(jìn)程的管道寫入/讀取數(shù)據(jù)。

ok,我們看看代碼

start();
    $workers[$pid] = $process;//將每一個(gè)進(jìn)程的句柄存起來
}
// 這里是主進(jìn)程哦。
foreach($workers as $pid => $process){// $process 是子進(jìn)程的句柄
    $process->write("hello worker[$pid]
");//子進(jìn)程句柄向自己管道里寫內(nèi)容                  $process->write($data);
    echo "From Worker: ".$process->read();//子進(jìn)程句柄從自己的管道里面讀取信息    $process->read();
    echo PHP_EOL.PHP_EOL;
 }

function workerFunc(swoole_process $worker){//這里是子進(jìn)程哦
    $recv = $worker->read();
    echo PHP_EOL. "From Master: $recv
";
    //send data to master
    $worker->write("hello master , this pipe  is ". $worker->pipe .";  this  pid  is ".$worker->pid."
");
    sleep(2);
    $worker->exit(0);
}

貼上運(yùn)行結(jié)果

From Master: hello worker[8205]

From Worker: hello master , this pipe  is 3;  this  pid  is 8205



From Master: hello worker[8206]

From Worker: hello master , this pipe  is 5;  this  pid  is 8206

喔,通訊是這樣的。
首先 將所有的子進(jìn)程的句柄都存到 主進(jìn)程的一個(gè)數(shù)組里,數(shù)組下標(biāo)就是pid。
當(dāng)主進(jìn)程想和哪個(gè)進(jìn)程通訊,就使用那個(gè)句柄向?qū)?yīng)管道里面 寫/讀 數(shù)據(jù),這樣就實(shí)現(xiàn)了進(jìn)程間的通訊。

接著,我們稍微改一下,看看運(yùn)行效果

$redirect_stdout = true;// 重定向輸出  注意 這次我改成 true 了,其他沒變
$worker_num = 2;//進(jìn)程數(shù)量
$workers = [];//存放進(jìn)程用的
for($i = 0; $i < $worker_num; $i++){
    $process = new swoole_process("workerFunc",$redirect_stdout );
    $pid = $process->start();
    $workers[$pid] = $process;//將每一個(gè)進(jìn)程的句柄存起來
}

// 這里是主進(jìn)程哦。
foreach($workers as $pid => $process){// $process 是子進(jìn)程的句柄
    $process->write("hello worker[$pid]
");//子進(jìn)程句柄向自己管道里寫內(nèi)容                $process->write($data);
    echo "From Worker: ".$process->read();//子進(jìn)程句柄從自己的管道里面讀取信息    $process->read();
    echo PHP_EOL.PHP_EOL;
 }

function workerFunc(swoole_process $worker){//這里是子進(jìn)程哦
    $recv = $worker->read();
    echo PHP_EOL. "From Master: $recv
";
    //send data to master
    $worker->write("hello master , this pipe  is ". $worker->pipe .";  this  pid  is ".$worker->pid."
");
    sleep(2);
    $worker->exit(0);
}

輸出結(jié)果

From Worker: 
From Master: hello worker[8007]



From Worker: 
From Master: hello worker[8008]

誒,不一樣了有沒有。我們?cè)倏纯磩?chuàng)建進(jìn)程時(shí)第二個(gè)參數(shù)的說明

  

$redirect_stdin_stdout,重定向子進(jìn)程的標(biāo)準(zhǔn)輸入和輸出。 啟用此選項(xiàng)后,在進(jìn)程內(nèi)echo將不是打印屏幕,而是寫入到管道。讀取鍵盤輸入將變?yōu)閺墓艿乐凶x取數(shù)據(jù)。 默認(rèn)為阻塞讀取。

我來說明一下,因?yàn)閯?chuàng)建的時(shí)候指定了true,子進(jìn)程中echo的內(nèi)容就到了管道里面,而不是打印在屏幕上(這一點(diǎn)類似于php的ob緩存機(jī)制,大家想象一下)
前面說了,進(jìn)程的通訊是通過從管道里面讀/寫數(shù)據(jù)實(shí)現(xiàn)的,而 子進(jìn)程 里 echo 的內(nèi)容被 重定向到管道里面了,所以,主進(jìn)程從管道里讀到的內(nèi)容,就是 子進(jìn)程中 echo 的 內(nèi)容。
也就造成了上面的 輸出結(jié)果。

消息隊(duì)列

我先來個(gè)鏈接 利用PHP操作Linux消息隊(duì)列完成進(jìn)程間通信
重點(diǎn)是這個(gè)文章里面的兩個(gè)鏈接文章啊,大家等會(huì)看看
還有一個(gè)命令

  

ipcs -q 查看當(dāng)前的消息隊(duì)列

這部分 下次討論

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/20990.html

相關(guān)文章

  • swoole教程一節(jié):進(jìn)程管理模塊(Process)-中(消息隊(duì)列)

    摘要:不多說,上代碼這段代碼出自消息隊(duì)列我想說五個(gè)點(diǎn)的創(chuàng)建默認(rèn)是創(chuàng)建的管道,當(dāng)想用消息隊(duì)列時(shí),記得把參數(shù)設(shè)成其實(shí)我發(fā)現(xiàn)不寫也行要在的之前調(diào)用,方法默認(rèn)是阻塞的一定一定要寫這里坑死不少人還有第五點(diǎn)注意事項(xiàng),我接下來重點(diǎn)說,因?yàn)檫@個(gè)點(diǎn)卡了我好久。 不多說,上代碼

    A Loity 評(píng)論0 收藏0
  • 基于SwooleProcess進(jìn)程管理模塊支付結(jié)果回調(diào)服務(wù)

    摘要:原先用的多線程實(shí)現(xiàn)的支付結(jié)果回調(diào)服務(wù),在后期運(yùn)行中出現(xiàn)了服務(wù)停止的問題,在學(xué)習(xí)的過程中,發(fā)現(xiàn)可以用的進(jìn)程管理模塊實(shí)現(xiàn)多線程的功能,并且使用定時(shí)器功能實(shí)現(xiàn)進(jìn)程監(jiān)控在子進(jìn)程退出的時(shí)候進(jìn)行重啟。 原先用PHP的Pthread多線程實(shí)現(xiàn)的支付結(jié)果回調(diào)服務(wù),在后期運(yùn)行中出現(xiàn)了服務(wù)停止的問題,在學(xué)習(xí)swoole的過程中,發(fā)現(xiàn)可以用swoole的Process進(jìn)程管理模塊實(shí)現(xiàn)多線程的功能,并且使用s...

    wenzi 評(píng)論0 收藏0
  • PHP多進(jìn)程系列筆記(五)

    摘要:消息隊(duì)列更常見的用途是主進(jìn)程分配任務(wù),子進(jìn)程消費(fèi)執(zhí)行。子進(jìn)程前面加了個(gè),這是為了防止父進(jìn)程還未往消息隊(duì)列中加入內(nèi)容直接退出。 前面幾節(jié)都是講解pcntl擴(kuò)展實(shí)現(xiàn)的多進(jìn)程程序。本節(jié)給大家介紹swoole擴(kuò)展的swoole_process模塊。 swoole多進(jìn)程 swoole_process 是swoole提供的進(jìn)程管理模塊,用來替代PHP的pcntl擴(kuò)展。 首先,確保安裝的swoole...

    qianfeng 評(píng)論0 收藏0
  • Swoole 在 Swoft 中的應(yīng)用

    摘要:在中的應(yīng)用官網(wǎng)源碼解讀號(hào)外號(hào)外歡迎大家我們開發(fā)組定了一個(gè)就線下聚一次的小目標(biāo)上一篇源碼解讀反響還不錯(cuò)不少同學(xué)推薦再加一篇講解一下中使用到的功能幫助大家開啟的實(shí)戰(zhàn)之旅服務(wù)器開發(fā)涉及到的相關(guān)技術(shù)領(lǐng)域的知識(shí)非常多不日積月累打好基礎(chǔ)是很難真正 date: 2017-12-14 21:34:51title: swoole 在 swoft 中的應(yīng)用 swoft 官網(wǎng): https://www.sw...

    EscapedDog 評(píng)論0 收藏0
  • Swoole筆記(四)

    摘要:配合模塊,創(chuàng)建的子進(jìn)程可以異步的事件驅(qū)動(dòng)模式。默認(rèn)為阻塞讀取。函數(shù)用于將一個(gè)加入到的事件監(jiān)聽中。為事件類型的掩碼,可選擇關(guān)閉開啟可讀可寫事件,如,,或者。在程序中使用,可以理解為在進(jìn)程中將此注冊(cè)到事件中。 Process Process是swoole內(nèi)置的進(jìn)程管理模塊,用來替代PHP的pcntl擴(kuò)展。 swoole_process支持重定向標(biāo)準(zhǔn)輸入和輸出,在子進(jìn)程內(nèi)echo不會(huì)打印屏...

    yzd 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<