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

資訊專欄INFORMATION COLUMN

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

A Loity / 494人閱讀

摘要:不多說,上代碼這段代碼出自消息隊(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)卡了我好久。

不多說,上代碼

useQueue();
    $pid = $process->start();
    $workers[$pid] = $process;
    //echo "Master: new worker, PID=".$pid."
";
}

function callback_function(swoole_process $worker)
{
    //echo "Worker: start. PID=".$worker->pid."
";
    //recv data from master
    $recv = $worker->pop();

    echo "From Master: $recv
";

    sleep(2);
    $worker->exit(0);
}

foreach($workers as $pid => $process)
{
    $process->push("hello worker[$pid]
");
}

for($i = 0; $i < $worker_num; $i++)
{
    $ret = swoole_process::wait();
    $pid = $ret["pid"];
    unset($workers[$pid]);
    echo "Worker Exit, PID=".$pid.PHP_EOL;
}

這段代碼出自 消息隊(duì)列

我想說五個(gè)點(diǎn)

swoole_process 的創(chuàng)建默認(rèn)是創(chuàng)建的管道,當(dāng)想用消息隊(duì)列時(shí),記得把參數(shù)設(shè)成false(其實(shí)我發(fā)現(xiàn)不寫也行)

useQueue要在start的之前調(diào)用,

pop方法 默認(rèn)是阻塞的

一定一定要寫wait(這里坑死不少人)

還有第五點(diǎn)注意事項(xiàng),我接下來重點(diǎn)說,因?yàn)檫@個(gè)點(diǎn)卡了我好久。

嘛,demo里面只是說主進(jìn)程向子進(jìn)程發(fā)數(shù)據(jù),沒有子進(jìn)程向主進(jìn)程發(fā)數(shù)據(jù),我就來加上吧

useQueue();
    $pid = $process->start();
    $workers[$pid] = $process;
    //echo "Master: new worker, PID=".$pid."
";
}

function callback_function(swoole_process $worker)
{
    //echo "Worker: start. PID=".$worker->pid."
";
    //recv data from master
    $recv = $worker->pop();
    echo "From Master: $recv
";
    $worker->push(" 
   hehe   
 ");//這里子進(jìn)程向主進(jìn)程發(fā)送  hehe
    sleep(2);//注意這里有個(gè)sleep
    $worker->exit(0);

}

foreach($workers as $pid => $process)
{
    $process->push("hello worker[$pid]
");
    $result = $process->pop();
    echo "From worker: $result
";//這里主進(jìn)程,接受到的子進(jìn)程的數(shù)據(jù)
}

for($i = 0; $i < $worker_num; $i++)
{
    $ret = swoole_process::wait();
    $pid = $ret["pid"];
    unset($workers[$pid]);
    echo "Worker Exit, PID=".$pid.PHP_EOL;
}

運(yùn)行結(jié)果完美,我就不貼了,
我看著代碼,忽然發(fā)現(xiàn)自己沒把sleep刪掉,然后噩夢(mèng)開始
大家把上面代碼的sleep注釋后運(yùn)行看看,我這里貼上我的運(yùn)行結(jié)果

From Master: hello worker[3667]

From worker:  
   hehe   

PHP Warning:  swoole_process::push(): msgsnd() failed. Error: Invalid argument[22] in /home/sun/learn/swoole/process/demo.php on line 28
PHP Warning:  swoole_process::pop(): msgrcv() failed. Error: Invalid argument[22] in /home/sun/learn/swoole/process/demo.php on line 29
From worker: 
PHP Warning:  swoole_process::pop(): msgrcv() failed. Error: Identifier removed[43] in /home/sun/learn/swoole/process/demo.php on line 18
From Master: 
PHP Warning:  swoole_process::push(): msgsnd() failed. Error: Invalid argument[22] in /home/sun/learn/swoole/process/demo.php on line 20
Worker Exit, PID=3668
Worker Exit, PID=3667

這就是我的報(bào)錯(cuò),我看這個(gè)錯(cuò)誤,發(fā)現(xiàn)第一個(gè)進(jìn)程是完美執(zhí)行的,和預(yù)先想的一樣,錯(cuò)誤出在主進(jìn)程第二次發(fā)送消息到消息隊(duì)列時(shí)出現(xiàn)的,主進(jìn)程的數(shù)據(jù)發(fā)送出錯(cuò)了

哎呀,怎么回事,不明白。
其實(shí)故事是這樣的
主進(jìn)程創(chuàng)建兩個(gè)子進(jìn)程,這里沒問題
主進(jìn)程向第一個(gè)子進(jìn)程發(fā)數(shù)據(jù),第一個(gè)子進(jìn)程收到后向主進(jìn)程回發(fā)數(shù)據(jù),這里也沒問題
主進(jìn)程再向第二個(gè)子進(jìn)程發(fā)數(shù)據(jù),好,出問題了,
那么 問題來了,第一個(gè)子進(jìn)程做了什么我們不知道的事情?
請(qǐng)看這里 子進(jìn)程臨死前做了什么

  

$status是退出進(jìn)程的狀態(tài)碼,如果為0表示正常結(jié)束,會(huì)繼續(xù)執(zhí)行PHP的shutdown_function,其他擴(kuò)展的 清理工作

第一個(gè)子進(jìn)程臨死前把消息隊(duì)列給埋了

換句話說,主進(jìn)程再想往消息隊(duì)列里寫東西時(shí)寫不了了,因?yàn)闆]有消息隊(duì)列了。

那為什么剛開始有sleep的時(shí)候就沒事呢?

因?yàn)槌弥谝粋€(gè)子進(jìn)程睡覺的時(shí)候,主進(jìn)程和第二個(gè)子進(jìn)程把事情做了

那么我們?cè)趺崔k?怎么才能不讓子進(jìn)程摧毀消息隊(duì)列??

  

把 swoole_process->exit(0) 改成 swoole_process->exit(1)了

這是我要說的第五點(diǎn)

  

多個(gè)子進(jìn)程使用消息隊(duì)列通訊一定寫上 $process->exit(1)

好的,基本上遵守這五條,使用消息隊(duì)列就不會(huì)有什么問題了。最后請(qǐng)記得升級(jí)自己的swoole版本,因?yàn)橛行﹩栴}可能是因?yàn)槟愕陌姹咎狭?/p>

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

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

相關(guān)文章

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

    摘要:當(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 ...

    Towers 評(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-2.1.2 進(jìn)程模塊的使用

    摘要:在版本中我們將的進(jìn)程管理模塊封裝成了類,現(xiàn)在可以在代碼中使用的進(jìn)程管理器了。提供的進(jìn)程管理器來自于,經(jīng)過大量生產(chǎn)項(xiàng)目驗(yàn)證,穩(wěn)定性和健壯性都非常高。三任務(wù)投遞進(jìn)程管理器自帶了消息隊(duì)列和消息投遞的支持。 在Swoole-2.1.2版本中我們將Server的進(jìn)程管理模塊封裝成了PHP類,現(xiàn)在可以在PHP代碼中使用Swoole的進(jìn)程管理器了。 在實(shí)際項(xiàng)目中經(jīng)常需要寫一些長期運(yùn)行的腳本,如基于r...

    ZoomQuiet 評(píng)論0 收藏0
  • Swoft 源碼剖析 - Swoole和Swoft的那些事(Task投遞/定時(shí)任務(wù)篇)

    摘要:作為定時(shí)任務(wù)的執(zhí)行者,通過每喚醒自身一次,然后把執(zhí)行表遍歷一次,挑選當(dāng)下需要執(zhí)行的任務(wù),通過投遞出去并更新該任務(wù)執(zhí)行表中的狀態(tài)。 作者:bromine鏈接:https://www.jianshu.com/p/b44...來源:簡(jiǎn)書著作權(quán)歸作者所有,本文已獲得作者授權(quán)轉(zhuǎn)載,并對(duì)原文進(jìn)行了重新的排版。Swoft Github: https://github.com/swoft-clou.....

    vvpvvp 評(píng)論0 收藏0
  • swoole_process父子進(jìn)程管道通信案例

    摘要:話不多說直接上代碼創(chuàng)建的子進(jìn)程獲取異步獲取更高性能啟動(dòng)子進(jìn)程子進(jìn)程處理邏輯異步非阻塞網(wǎng)關(guān)連接失敗讀取父進(jìn)程管道消息父進(jìn)程獲取子進(jìn)程的管道消息子進(jìn)程消息子進(jìn)程的客戶端可以忽略不計(jì),本只是 話不多說直接上代碼 創(chuàng)建的子進(jìn)程: public function __construct() { $this->redis = Container::get(SwooleR...

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

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

0條評(píng)論

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