亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

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

A Loity / 541人閱讀

摘要:不多說,上代碼這段代碼出自消息隊列我想說五個點的創(chuàng)建默認(rèn)是創(chuàng)建的管道,當(dāng)想用消息隊列時,記得把參數(shù)設(shè)成其實我發(fā)現(xiàn)不寫也行要在的之前調(diào)用,方法默認(rè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;
}

這段代碼出自 消息隊列

我想說五個點

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

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

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

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

還有第五點注意事項,我接下來重點說,因為這個點卡了我好久。

嘛,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);//注意這里有個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;
}

運行結(jié)果完美,我就不貼了,
我看著代碼,忽然發(fā)現(xiàn)自己沒把sleep刪掉,然后噩夢開始
大家把上面代碼的sleep注釋后運行看看,我這里貼上我的運行結(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

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

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

  

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

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

換句話說,主進(jìn)程再想往消息隊列里寫東西時寫不了了,因為沒有消息隊列了。

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

因為趁著第一個子進(jìn)程睡覺的時候,主進(jìn)程和第二個子進(jìn)程把事情做了

那么我們怎么辦?怎么才能不讓子進(jìn)程摧毀消息隊列??

  

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

這是我要說的第五點

  

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

好的,基本上遵守這五條,使用消息隊列就不會有什么問題了。最后請記得升級自己的swoole版本,因為有些問題可能是因為你的版本太老了

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

轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.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)程哦貼上運行結(jié)果喔,通訊是這樣的。我們再看看創(chuàng)建進(jìn)程時第二個參數(shù)的說明,重定向子進(jìn)程的標(biāo)準(zhǔn)輸入和輸出。 進(jìn)程管理模塊 介紹看這里 swoole的process 大家可以先看看自己的swoole版本,在命令行里面敲 php --ri swoole ...

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

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

    qianfeng 評論0 收藏0
  • Swoole-2.1.2 進(jìn)程模塊的使用

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

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

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

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

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

    Cheng_Gang 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<