AMPS:非阻塞模块和I/O代理

  AMPS中模块分为非阻塞、阻塞和I/O 代理两种类型。

  •   无阻塞模块:如发送和接收网络消息,或者读写文件。
  •   阻塞模块和I/O代理:
               有些场景下阻塞可能无法实现,例如DNS查询或者数据库交互。这种场景下,AMPS要求开发者以I/O代理的形式创建模块,I/O代理准备I/O请求,并花大量时间等待操作完成,它由一个事件调度器和一个线程池组成。池中的每个线程关联一个事件队列,在空闲状态下线程在事件队列中保持阻塞,调度器被主事件管理器作为事件句柄注册。它从池中选择一个线程,并且分发一个接收事件到与线程关联的队列。这样设计的优点是当有大量的I/O请求时,可以将其一并保存在队列中。每个线程执行同样的代码,一旦由于队列中的新事件线程唤醒后,它调用事件句柄进行处理,而句柄可能在I/O操作期间阻塞,此时这个线程为阻塞事件提供服务,而程序继续处理未被分发的事件。

AMPS:非阻塞模块和I/O代理_第1张图片

  在上图中,当模块1请求一个由模块2提供的服务时,(模块2为一个I/O代理,由一个线程池和一个分发函数组成,分发函数以回调函数的形式注册给事件管理器,线程池包括4个线程),由模型1产生的请求R1通过事件调试程序路由给模块2,并且它的分发函数被调用,分发函数在线程池中选择一个线程(如线程2),并将请求传给此线程,线程开始处理这个请求,当I/O操作完成后,它产生一个响应事件RES1并路由回给模块1(模块1注册了此事件类型)。

你可能感兴趣的:(AMPS:非阻塞模块和I/O代理)