worker初學(xué)者
?
目前正在讀手冊(cè),讀到設(shè)置worker進(jìn)程數(shù)和onWorkerReload屬性時(shí)產(chǎn)生疑問(wèn)
?
想知道在使用worker的過(guò)程中,worker實(shí)例的多個(gè)進(jìn)程分別是什么時(shí)候啟動(dòng)的,onWorkerReload屬性的講解中,子進(jìn)程又是什么?在文檔-接口-stopAll中,也出現(xiàn)類(lèi)似表述。
?
1.? ?worker實(shí)例的多個(gè)進(jìn)程分別是在 workerman 執(zhí)行完【上下文環(huán)境檢測(cè) --> worker各種初始化 ---> 信號(hào)安裝】等環(huán)節(jié)后分別fork 啟動(dòng)各個(gè)實(shí)例的子進(jìn)程的,在應(yīng)用層代碼里就是 onWorkerStart 回調(diào)即代表成功啟動(dòng)了該子進(jìn)程。
2.? 子進(jìn)程是什么? 子進(jìn)程就是由父進(jìn)程派生fork出來(lái)的進(jìn)程,父進(jìn)程專(zhuān)門(mén)用于管理子進(jìn)程,要時(shí)刻監(jiān)控子進(jìn)程以便子進(jìn)程退出時(shí)能夠正?;厥兆舆M(jìn)程,防止產(chǎn)生僵尸進(jìn)程,不處理任何業(yè)務(wù),而子進(jìn)程則用來(lái)處理外部請(qǐng)求。
是不是這樣:
workerman會(huì)有一個(gè)主進(jìn)程,然后所有的worker實(shí)例里設(shè)置的count個(gè)進(jìn)程全部都是子進(jìn)程
準(zhǔn)確的說(shuō):
@614:想追問(wèn)個(gè)問(wèn)題,假如worker->count設(shè)定4個(gè)子進(jìn)程編號(hào)0123,啟動(dòng)后先后進(jìn)來(lái)10個(gè)連接,如何分配給4個(gè)子進(jìn)程,是均衡分配,還是一個(gè)子進(jìn)程滿之后再由第二個(gè)子進(jìn)程來(lái)處理??
@614:
設(shè)置Worker->count = 4;
public function onMessage($connection, $data)
{
$worker = $connection->worker;//$worker
。。。。。
foreach($worker->connections as $con){。。。。}
}
文檔中說(shuō),$worker是當(dāng)前connection對(duì)象所屬的worker實(shí)例,那么這個(gè)$worker是主進(jìn)程還是子進(jìn)程?遍歷獲取的$con涵蓋所有子進(jìn)程上的連接嗎?
@614:我在用workerman寫(xiě)聊天室,如果設(shè)置多個(gè)子進(jìn)程,那么接受用戶聊天信息后就要群發(fā),而 $connection->worker只能獲取到當(dāng)前進(jìn)程下的連接。那么就需要再去使用channel組件是嗎?
@5344:
1、群發(fā)與否與你采用單進(jìn)程還是多進(jìn)程開(kāi)發(fā)并沒(méi)有什么直接的關(guān)系。
2、workerman的單進(jìn)程模型下做群發(fā)或單發(fā)處理起來(lái)很簡(jiǎn)單,因?yàn)樗械倪B接都在一個(gè)進(jìn)程內(nèi)接受維護(hù)。
3、workerman的多進(jìn)程模型開(kāi)發(fā)時(shí),無(wú)論是私聊還是群發(fā),必須考慮多進(jìn)程間的通信,這點(diǎn)正是你提問(wèn)的問(wèn)題所在了,多進(jìn)程通信的手段有很多,比如官方的channel組件、globaldata組件、以及很多消息隊(duì)列組件等等。
4、最后建議使用gatewayworker, 官方已經(jīng)幫細(xì)節(jié)都實(shí)現(xiàn)好了,拿來(lái)即用;當(dāng)然基于workerman自己搞也完全可以,只不過(guò)利用workerman開(kāi)發(fā)聊天系統(tǒng)需要具備多進(jìn)程模型定制能力,要考慮很多細(xì)節(jié)問(wèn)題。