8 Netty IO模型和线程模型
2022-02-12 17:13:10 1 举报
Netty IO模型和线程模型
作者其他创作
大纲/内容
④如果线程不是EventLoop的那个线程,则将任务放在队列以便EventLoop下一次处理它的事件时执行
channel
Thread
②在connect()方法被调用后,Bootstrap类将会创建一个新的channel
使用selector的非阻塞IO
Dispatcher
服务器
11.websocket应用程序逻辑
read/encode
执行
Acceptor
创建新的channel
socket
③读取操作(可能会阻塞)
客户端
EventLoop
10.websocket
2.使用selector的非阻塞IO
ServerChannel
Y
①广播者监听新的文件内容
8.客户端引导过程
②当连接接受时,ServerChannel将会创建一个新的子Channel
③聊天室服务器
③事件监视器监听并且显示消息的内容
已注册的
Channel
Runnable
事件监听器
读/写
HTTPWebsocket握手
9.服务器引导过程
Bootstrap
④空闲Thread组成的列表
auth
状态变化
选择(... ...)
Executor:execute(...)
Executor实现(线程池)
12.服务器逻辑
④读取完成
Handler...
bind ( . . . )
监听UDP消息
④服务器响应到地址为/的URI请求,其将传输index.html
①分配给socket的线程
5.Executor的执行逻辑
N
Shake-hand
Websocket
②双向发送消息
读取(...)
③如果就是相同的线程,则那你在EventLoop中,可以直接执行任务
⑥在协议升级完成之后,服务器将会通过Websocket发送消息
①客户端连接服务器,并且成为聊天的一部分
7.用于非阻塞传输(如NIO和AIO)的EventLoop分配方式
Hi there
使用HTTP协议进行Websocket协议握手
②连接远程节点的socket
注册
client
NIO-Thread2
business
读取完成
在EventLoop中?
FreeThreads
①要执行的任务
SLA
13.广播系统概览
Container
阻塞IO处理多个连接
任务
服务器(HTTP)和客户端通信
⑤处理可读字节
处理其他的任务
①新的channel注册到选择器
HTTP
所有的EventLoop都由这个EventLoopGroup分配。有三个正在使用的EventLoop
每个EventLoop将处理分配给它的所有channel的所有事件和任务。每个EventLoop都和一个Thread相关联
处理byte[]
selector
监听新的文件内容
new 1.netty线程模型
EventLoopGroup将为每个新创建的Channel分配一个EventLoop。在每个channel的整个生命周期内,,所有的操作都将由想同你的Thread执行
③从线程池中拉取一个可用的Thread,并执行任务。当任务完成时,将该Thread返回给空闲列表,使其可被重用
1.阻塞IO处理多个连接
login
①客户端通过HTTP(S)向服务器发起Websocket握手,并等待确认
⑥处理所有的状态变化
处理状态改变
Hi threre
Main Reactor Thread Pool(Accept Pool)
Handler2
Sub Reactor Thread Pool(IO Pool)
④服务器为所有的客户端提供服务
ServerBootstrap
⑥执行其他提交的属于socket的任务
通过HTTP协议
⑤检查是否有状态变化
②选择器处理状态变化的通知
③之前已注册的channel
客户端(HTTP)和服务器通信
/ws
②在把任务传递给execute方你发之后,执行检查以确定当前调用线程是否就是分配给EventLoop的那个线程
②通过UDP广播事件
①聊天室客户端
②链接协议升级到Websocket
②客户端发送HTTP请求(到标准的/或者位置为/ws的URI)
主从多Reactor模型
①将要在EventLoop执行的任务
具有3个EventLoop的EventLoopGroup
⑦在选择器运行的同一线程中执行其他任务
Handler1
NIO-Thread ...
读取成功
⑤如果地址为/ws的URI被访问,那么服务器将会处理Websocket升级
没有可读的
获取空闲的Thread并执行
用户调用方法
⑦尝试再次读取
write/decode
②任务被递交给了线程池
4.OIO的处理逻辑
NIO-Thread1
Selector
入队
6.EventLoop的执行逻辑
3.NIO非阻塞IO选择并处理状态的变化
③Selector.select()将会阻塞,直到接收到新的状态变化或配置的超时时间超时
执行其他task
①Bootstrap类将会在bind()方法被调用后创建一个新的channel,在这之后将会调用connect()方法以建立连接
①当bind()方法被调用时,将会创建一个ServerChannelchannel
③通过Websocket交换聊天消息
0 条评论
下一页