摘要:不多說,上代碼這段代碼出自消息隊列我想說五個點的創建默認是創建的管道,當想用消息隊列時,記得把參數設成其實我發現不寫也行要在的之前調用,方法默認是阻塞的一定一定要寫這里坑死不少人還有第五點注意事項,我接下來重點說,因為這個點卡了我好久。
不多說,上代碼
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 的創建默認是創建的管道,當想用消息隊列時,記得把參數設成false(其實我發現不寫也行)
useQueue要在start的之前調用,
pop方法 默認是阻塞的
一定一定要寫wait(這里坑死不少人)
還有第五點注意事項,我接下來重點說,因為這個點卡了我好久。
嘛,demo里面只是說主進程向子進程發數據,沒有子進程向主進程發數據,我就來加上吧
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 ");//這里子進程向主進程發送 hehe sleep(2);//注意這里有個sleep $worker->exit(0); } foreach($workers as $pid => $process) { $process->push("hello worker[$pid] "); $result = $process->pop(); echo "From worker: $result ";//這里主進程,接受到的子進程的數據 } for($i = 0; $i < $worker_num; $i++) { $ret = swoole_process::wait(); $pid = $ret["pid"]; unset($workers[$pid]); echo "Worker Exit, PID=".$pid.PHP_EOL; }
運行結果完美,我就不貼了,
我看著代碼,忽然發現自己沒把sleep刪掉,然后噩夢開始了
大家把上面代碼的sleep注釋后運行看看,我這里貼上我的運行結果
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
這就是我的報錯,我看這個錯誤,發現第一個進程是完美執行的,和預先想的一樣,錯誤出在主進程第二次發送消息到消息隊列時出現的,主進程的數據發送出錯了
哎呀,怎么回事,不明白。
其實故事是這樣的
主進程創建兩個子進程,這里沒問題
主進程向第一個子進程發數據,第一個子進程收到后向主進程回發數據,這里也沒問題
主進程再向第二個子進程發數據,好,出問題了,
那么 問題來了,第一個子進程做了什么我們不知道的事情?
請看這里 子進程臨死前做了什么
$status是退出進程的狀態碼,如果為0表示正常結束,會繼續執行PHP的shutdown_function,其他擴展的 清理工作
第一個子進程臨死前把消息隊列給埋了
換句話說,主進程再想往消息隊列里寫東西時寫不了了,因為沒有消息隊列了。
那為什么剛開始有sleep的時候就沒事呢?
因為趁著第一個子進程睡覺的時候,主進程和第二個子進程把事情做了
那么我們怎么辦?怎么才能不讓子進程摧毀消息隊列??
把 swoole_process->exit(0) 改成 swoole_process->exit(1)了
這是我要說的第五點
多個子進程使用消息隊列通訊一定寫上 $process->exit(1)
好的,基本上遵守這五條,使用消息隊列就不會有什么問題了。最后請記得升級自己的swoole版本,因為有些問題可能是因為你的版本太老了
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/21065.html
摘要:當子進程都完成了,主進程開始繼續業務。是子進程的句柄子進程句柄向自己管道里寫內容子進程句柄從自己的管道里面讀取信息這里是子進程哦貼上運行結果喔,通訊是這樣的。我們再看看創建進程時第二個參數的說明,重定向子進程的標準輸入和輸出。 進程管理模塊 介紹看這里 swoole的process 大家可以先看看自己的swoole版本,在命令行里面敲 php --ri swoole ...
摘要:消息隊列更常見的用途是主進程分配任務,子進程消費執行。子進程前面加了個,這是為了防止父進程還未往消息隊列中加入內容直接退出。 前面幾節都是講解pcntl擴展實現的多進程程序。本節給大家介紹swoole擴展的swoole_process模塊。 swoole多進程 swoole_process 是swoole提供的進程管理模塊,用來替代PHP的pcntl擴展。 首先,確保安裝的swoole...
摘要:在版本中我們將的進程管理模塊封裝成了類,現在可以在代碼中使用的進程管理器了。提供的進程管理器來自于,經過大量生產項目驗證,穩定性和健壯性都非常高。三任務投遞進程管理器自帶了消息隊列和消息投遞的支持。 在Swoole-2.1.2版本中我們將Server的進程管理模塊封裝成了PHP類,現在可以在PHP代碼中使用Swoole的進程管理器了。 在實際項目中經常需要寫一些長期運行的腳本,如基于r...
摘要:作為定時任務的執行者,通過每喚醒自身一次,然后把執行表遍歷一次,挑選當下需要執行的任務,通過投遞出去并更新該任務執行表中的狀態。 作者:bromine鏈接:https://www.jianshu.com/p/b44...來源:簡書著作權歸作者所有,本文已獲得作者授權轉載,并對原文進行了重新的排版。Swoft Github: https://github.com/swoft-clou.....
摘要:話不多說直接上代碼創建的子進程獲取異步獲取更高性能啟動子進程子進程處理邏輯異步非阻塞網關連接失敗讀取父進程管道消息父進程獲取子進程的管道消息子進程消息子進程的客戶端可以忽略不計,本只是 話不多說直接上代碼 創建的子進程: public function __construct() { $this->redis = Container::get(SwooleR...
閱讀 1885·2021-11-19 09:40
閱讀 2604·2021-08-30 09:46
閱讀 2188·2021-08-03 14:01
閱讀 2656·2019-08-30 10:54
閱讀 1206·2019-08-29 16:38
閱讀 1449·2019-08-29 11:02
閱讀 2543·2019-08-28 18:16
閱讀 1691·2019-08-28 18:09