設置Worker實例的進程數(shù)(count屬性),則會創(chuàng)建count個Worker進程同時監(jiān)聽相同的端口,并行的接收客戶端連接,處理連接上的事件,但是使用listen這個方法的時候,使用Worker內(nèi)部啟動多個Worker實例特性時,Worker->count一般只能為1,也就是說無法多進程使用這個特性。原因是無法做到多個進程重復監(jiān)聽同一個端口,多個進程重復監(jiān)聽同一個端口會報Address already in use錯誤。這個我怎么感覺前后有沖突啊。。開始說,可以多個進程監(jiān)聽同一個接口,后面,又不行了。。
linux的socket監(jiān)聽規(guī)則
1、如果某個端口已經(jīng)被監(jiān)聽,那么不能再創(chuàng)建socket監(jiān)聽這個端口(沒開SO_REUSEPORT)。
2、如果某個進程監(jiān)聽了某個端口,那么它fork出的子進程自動繼承了監(jiān)聽,能達到多進程同時監(jiān)聽相同端口的效果
count屬性是在主進程設置的,主進程監(jiān)聽端口后fork出count個子進程,這count個子進程繼承了主進程的socket監(jiān)聽,所以多個Worker子進程能同時監(jiān)聽相同的端口,這個符合第二個規(guī)則。
listen方法主要用于子進程再監(jiān)聽socket,如果某個子進程已經(jīng)監(jiān)聽了某個端口,那么其它進程就不能再創(chuàng)建socket監(jiān)聽這個端口,符合規(guī)則1
手冊中可能沒說明白,稍后我再重新梳理下
run()
[attach]236[/attach]
子進程不繼承父進程的事件監(jiān)聽么,既然子進程繼承了父進程的listen()監(jiān)聽_mainSocket可讀事件,為啥子進程還要再次監(jiān)聽?