Proactor和Reactor都是并发编程中的设计模式。他们都是用于派发/分离IO操作事件的。所谓的IO事件也就是诸如read/write的IO操作。"派发/分离"就是将单独的IO事件通知到上层模块。两个模式不同的地方在于,
Proactor用于异步IO,而Reactor用于同步IO。
在Reactor中,事件分离器负责等待文件描述符或socket为读写操作准备就绪,然后将就绪事件传递给对应的处理器,最后由处理器负责完成实际的读写工作。 Reactor模式已经被广泛使用,著名的开源事件库libevent、libev、libuv都是使用Reactor模式。
Reactor处理耗时长的操作(如文件I/O)会造成事件分发的阻塞,影响到后续事件的处理。因此涉及到文件I/O相关的操作,需要使用异步I/O,即使用Proactor模式效果更佳。
一般地,I/O多路复用机制都依赖于一个事件多路分离器(Event Demultiplexer)。分离器对象可将来自事件源的I/O事件分离出来,并分发到对应的read/write事件处理器(Event Handler)。开发人员预先注册需要处理的事件及其事件处理器(或回调函数);事件分离器负责将请求事件传递给事件处理器。两个与事件分离器有关的模式是Reactor和Proactor。
Reactor反应器模式
Reactor模式又叫反应器或反应堆。平时接触的开源产品如libevent/libev/libuv/ZeroMQ/ACE,事件模型都使用的Reactor模式;在Reactor中,事件分离器负责等待文件描述符或socket为读写操作准备就绪,然后将就绪事件传递给对应的处理器,最后由处理器负责完成实际的读写工作。 Reactor模式已经被广泛使用,著名的开源事件库libevent、libev、libuv都是使用Reactor模式。
Reactor处理耗时长的操作(如文件I/O)会造成事件分发的阻塞,影响到后续事件的处理。因此涉及到文件I/O相关的操作,需要使用异步I/O,即使用Proactor模式效果更佳。