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