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

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

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



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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值