设计模式之reactor、proactor

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

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是一个同步操作模式。

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值