设计模式之reactor、proactor

时间:2022-09-09 14:34:11

看了很多说的不明不白,有的还和语言有关。

reactor、proactor他们同为派发/分离IO事件,而reactor为同步,proactor为异步。

什么意思呢?我们在编写网络程序的时候很想把网络数据和网络通信本身分离,这样可以很好的调试和分块。

1.典型的reactor模式为当数据来时,通知用户读

2.典型的proactor表现为数据到达时,为上面把数据存好后(当然可以是用户自定义的缓存区),调用用户的回调函数。

 

下面是一个读的例子(写的例子类同,事件句柄为socket,linux下为文件符,两种机制,select, epoll),windows也类似,处理相对复杂

Reactor:

1 事件句柄注册自己感兴趣的io事件

2 多路事件分发器等待io事件(select等)

3 io事件到来并唤醒多路事件分发器,多路器调用应用事件句柄

4 事件句柄进行实际读操作,处理读操作,重新声明感兴趣的io操作,并将控制权返回给多路分发器

Proactor :

1 事件句柄初始化一个异步读操作,此时该句柄并不在意异步操作结果,而是要获得完成事件而注册

2 事件多路器等待直到io事件完成

3 当事件多路器等待io事件时,操作系统在一个并行的内核线程上处理读操作,并将数据放到一个用户定义的缓冲中,并通知事件多路器操作完成。

4 事件多路器调用事件句柄

5 事件句柄从用户定义缓冲中获得用户数据并操作,然后开始新的异步操作并将控释返回事件多路器

可以看出,两个模式的相同点,都是对某个IO事件的事件通知(即告诉某个模块,这个IO操作可以进行或已经完成)。在结构上,两者也有相同点:demultiplexor负责提交IO操作(异步)、查询设备是否可操作(同步),然后当条件满足时,就回调handler。
不同点在于,异步情况下(Proactor),当回调handler时,表示IO操作已经完成;同步情况下(Reactor),回调handler时,表示IO设备可以进行某个操作(can read or can write),handler这个时候开始提交操作。

其实想说的是:Proactor是一个异步操作模式,而Reactor是一个同步操作模式。