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