workerman 疑问

huazai

设置Worker实例的进程数(count属性),则会创建count个Worker进程同时监听相同的端口,并行的接收客户端连接,处理连接上的事件,但是使用listen这个方法的时候,使用Worker内部启动多个Worker实例特性时,Worker->count一般只能为1,也就是说无法多进程使用这个特性。原因是无法做到多个进程重复监听同一个端口,多个进程重复监听同一个端口会报Address already in use错误。这个我怎么感觉前后有冲突啊。。开始说,可以多个进程监听同一个接口,后面,又不行了。。

3598 3 0
3个回答

walkor

linux的socket监听规则
1、如果某个端口已经被监听,那么不能再创建socket监听这个端口(没开SO_REUSEPORT)。
2、如果某个进程监听了某个端口,那么它fork出的子进程自动继承了监听,能达到多进程同时监听相同端口的效果

count属性是在主进程设置的,主进程监听端口后fork出count个子进程,这count个子进程继承了主进程的socket监听,所以多个Worker子进程能同时监听相同的端口,这个符合第二个规则。

listen方法主要用于子进程再监听socket,如果某个子进程已经监听了某个端口,那么其它进程就不能再创建socket监听这个端口,符合规则1

手册中可能没说明白,稍后我再重新梳理下

  • huazai 2016-01-29

    非常感谢您对我们小菜鸟的孜孜不倦的帮助。

lifesohard

run()
[attach]236[/attach]

子进程不继承父进程的事件监听么,既然子进程继承了父进程的listen()监听_mainSocket可读事件,为啥子进程还要再次监听?

  • 暂无评论
walkor

主进程并没有监听_mainSocket的读写事件,主进程不做业务的。_mainSocket的读写事件是由子进程监听的。

  • 暂无评论
年代过于久远,无法发表回答
🔝