注意: 不要在主進程中初始化數(shù)據(jù)庫、memcache、redis等連接資源,因為主進程初始化的連接可能會被子進程自動繼承(尤其是使用單例的時候),所有進程都持有同一個連接,服務端通過這個連接返回的數(shù)據(jù)在多個進程上都可讀,會導致數(shù)據(jù)錯亂。同樣的,如果任何一個進程關閉連接(例如daemon模式運行時主進程會退出導致連接關閉),都導致所有子進程的連接都被一起關閉,并發(fā)生不可預知的錯誤,例如mysql gone away 錯誤。
推薦在onWorkerStart里面初始化連接資源。
上面是手冊 http://doc.workerman.net/development/before-development.html 摘出來的。
1、主進程中初始化連接資源,會導致子進程都持有同一個鏈接資源,容易導致數(shù)據(jù)混亂,這個可以理解了。
2、但是每個子進程中的鏈接資源,就不會導致這個進程中處理數(shù)據(jù)混亂了嗎?拿數(shù)據(jù)庫連接來說,我的理解是,每個子進程能并發(fā)處理請求,那說明不同請求都會使用數(shù)據(jù)庫連接資源,甚至不同請求都在處理同一條數(shù)據(jù)。這樣不會導致數(shù)據(jù)混亂嗎,是什么機制呢?
每個worker進程都是獨立的連接,在單worker進程里面是同步阻塞執(zhí)行的,執(zhí)行完例如webman每次都會重置request對象所以不會發(fā)生數(shù)據(jù)污染。
意思也是類似php-fpm的運行方式嗎?
我查資料,pfm的運行方式是這樣。每個worker在啟動后阻塞著,有請求到達后worker開始讀取請求數(shù)據(jù),讀取完成后開始處理然后再返回,在這期間是不會接收其它請求,也就是說fpm的子進程同時只能響應一個請求,只有把這個請求處理完成后才會accept下一個請求
那意思像workerman中,如果設置worker=4,意思是同一時刻,只能處理4個請求嗎
可以理解為每個worker子進程的數(shù)據(jù)庫連接也是相互獨立的了?其中一個worker的數(shù)據(jù)庫i/o阻塞或中斷不會影響其它子進程,是這樣的嗎?