boss与worker

https://blog.csdn.net/weixin_34275734/article/details/91749489

在Netty的里面有一个Boss,他开了一家公司(开启一个服务端口)对外提供业务服务,它手下有一群做事情的workers。Boss一直对外宣传自己公司提供的业务,并且接受(accept)有需要的客户(client),当一位客户找到Boss说需要他公司提供的业务,Boss便会为这位客户安排一个worker,这个worker全程为这位客户服务(read/write)。如果公司业务繁忙,一个worker可能会为多个客户进行服务一个worker线程为多个连接轮训服务)。这就是Netty里面Boss和worker之间的关系。

 

对应于从实践模拟角度再议bio nio【重点】  即是accept线程和select线程

 

https://mp.weixin.qq.com/s/cB3DmHIF9_ZxAUjjfCYqOA

Netty里面有两个Group,分别是Boss Group和Worker Group。其中,Boss Group用于处于连接,Worker Group用于处理实际的读写IO。

Boss Group里面的NioEventLoop会轮询accept事件,遇到有新的连接,就生成NioSocketChannel,并把这个Channel注册到Worker Group的Selector上。

Worker Group轮询read和write事件,在可读或者可写条件满足时,就进行处理。

Worker Group和Boss Group都是通过里面的NioEventLoop来操作的。NioEventLoop中维护了一个线程和任务队列,支持异步提交执行任务,线程启动时会调用NioEventLoop的run方法。

最后都会执行一个runAllTasks方法,它用于处理任务队列中的任务。任务队列中的任务包括用户调用 eventloop.execute或schedule执行的任务,或者其他线程提交到该eventloop的任务。(业务线程的write便是 write异步与流量控制 4.0.29.Final )

https://mp.weixin.qq.com/s?__biz=MzA5NTUzNTA2Mw==&mid=2454932389&idx=1&sn=de7fa666e3338d0b0351eb1f40a06fed&chksm=871a011db06d880b54d872bae12ee2dcd7a516aab19dea49f9fedd7e8f92c902cdb6609a4e4e&mpshare=1&scene=1&srcid=1012BgHeQzJpF0wAOC4LXoJv&key=ba54fcb7d2a54783a2233ee23adb32973558740785a7a90ee19f765f4584a4d92755332a24cf82b405205e52839d8f22eb30c293e2c415ec40b974a6259430a2ea758508ed6cf0ff45b329466f9316b8&ascene=0&uin=MTA2NzUxMDAyNQ%3D%3D&devicetype=iMac+MacBookAir6%2C2+OSX+OSX+10.10.5+build(14F2511)&version=11020012&lang=zh_CN&pass_ticket=3sXqr7c2oEvhreALgBwX%2FGLK0mOv%2BqBK9kOHRAlS3NHnD19yGGWL0GX1fFKdJ7eU

每个Reactor线程配备了一个task队列和Delay task队列,分别用于存放系统Task和周期性Task,也就是说每个Reactor线程不仅要处理I/O事件,还会处理一些系统任务和调度任务。

 

 

https://mp.weixin.qq.com/s?__biz=MzUzMTA2NTU2Ng==&mid=2247485224&idx=2&sn=510b6f2de976b80f4f2c65988338620a&chksm=fa497899cd3ef18f7d61eafcf372c61412ca8dda121c650370cafcd707054703a59e63dc7e7b&mpshare=1&scene=1&srcid=10093E4oi3IqrrgTyjzPeQ4v&key=aabb2ccd6a655235489a98a8010871fd860370d6dc76bd25b584f375d8293bf0148b8d36c8905a912b770991dec6af2a8967d227316cd6c07c5883567bdb7ccd8f3a41eadcafbe74c569df290b1780f6&ascene=0&uin=MTA2NzUxMDAyNQ%3D%3D&devicetype=iMac+MacBookAir6%2C2+OSX+OSX+10.10.5+build(14F2511)&version=11020012&lang=zh_CN&pass_ticket=3sXqr7c2oEvhreALgBwX%2FGLK0mOv%2BqBK9kOHRAlS3NHnD19yGGWL0GX1fFKdJ7eU

Netty的I/O线程 NioEventLoop是否可以处理非I/O任务?

答案是肯定的,通过它提供的接口就可以看出这点

它的execute方法参数是Runnable,与JDK的线程池execute方法是等价的(异常处理策略存在差异)。

开了这个口子之后,就会存在风险,例如用户为了简化线程处理模型,把所有的业务任务封装成Task,丢到Netty用的I/O线程NioEventLoop中执行。为了防止过多的业务任务阻塞I/O线程的网络读写操作,NioEventLoop提供了设置I/O任务和非I/O任务的处理比例,通过合理的调整处理比例,来保证更合理的资源调度。

posted on 2020-01-04 00:04  silyvin  阅读(987)  评论(0编辑  收藏  举报