Reactor 模式介绍
介绍
Reactor 模式是一种非阻塞 IO(non-blocking IO) + IO 复用(IO multiplexing)模型, 程序的基本结构是一个事件循环(event loop),以事件驱动(event-driven)和事件回调的方式实现业务逻辑。
使用这种模式需要转换思维模式,把原来 主动调用 recv()来接收数据,主动调用 accept() 来接收新连接,主动调用 send()发送数据 的思路转换成 注册一个收数据的回调,收到数 据就会回调注册的函数;注册一个接收连接的回调,接收新的连接就会回掉函数,发送数据 时,只管往连接中写,低层库会负责无阻塞的发送
Reactor 的核心
Channel: 负责一个文件描述符的各个事件的处理。 Poller: IO multiplexing, 通过 Poller 拿到 IO 事件,具体可使用 poll,select,epoll 等。 EventLoop: 循环通过 Poller 拿到活动的 Channel,处理每个活动 Channel 上的事件。
上面是整个事件循环的伪代码,下面是一个时序图。
actor client
entity EventLoop
Entity Poller
Entity ChannelA
Entity ChannelB
client -> EventLoop : loop()
EventLoop -> Poller : poll()
Poller --> EventLoop : activeChannels
EventLoop -> ChannelA : handleEvent()
ChannelA -> : user callback
EventLoop -> ChannelB : handleEvent()
ChannelB -> : user callback
下面的伪代码利用上面的 loop()实现一个单次响应的定时器。
|
|
注:channel 结束时不会关闭它拥有的 fd, fd 由上层管理。