boost {asio reactor}

来源:互联网 发布:淘宝卖家怎么改店名 编辑:程序博客网 时间:2024/05/24 05:21

  学习了boost库。幸亏自己做过一个IOCP的框架,理解asio的设计还容易一些,虽然自己以前不知道这个就是reactor,。ACE也是实现的reactor,当时只接触过proactor的程序,看了半天也没看懂,明天再回过头学习下ACE,应该会好一些了。reactor是真正的异步,和IOCP的思路差不多,只不过用epoll,poll实现reactor就要做一些基础的工作了。说到底还是异步,异步就涉及到类似closure的东西,boost就用了bind来担当闭包的作用.IOCP的一部很容易理解,它自身就提供了WSASend,WSARecieve,WSAConnect,这种API,工作线程是需要GetQueue来处理就行了,用epoll,poll,select这种模拟的话,本质上还是proactor,因为必须检查是否可读/写才能做实际的操作,用了一个队列来作为Post的操作的缓存,单独开一个线程来处理队列内容。

  boost的实现我觉得通用性很好,它不只是用于IO,还有其他的timer,等等,我想就算做一个执行sql的reactor也是完全可行的,虽然这种东西用lua等脚本语言来实现会简单的多。在处理socket的io时,我认为提高效率的关键不是可以执行多次WSASend,而是每次的数据是否多,如果每次send的数据很少,代价是比较大的,而且在多个recieve时涉及到消息顺序和半包的问题。所以我的做法还是一个socket保证同一时刻最多有一个Recieve和send,在上一次send没有返回时如果有后续的send操作就把数据缓存起来,提高一次send操作的数据量,Recieve就很简单的每次recieve结束开始下一次recieve,包括资源的回收也是统一用一个异步操作完成。这么做简单,可靠,清晰,效率也足够高。关键就是把boost的实现不是简单的enqueue,而是要合并操作。

  ioservice的作用,现在我的理解就是服务管理器,单子模式,还有工厂的作用。它本身提供了异步操作,是一个很通用的抽象,accepter,socket都是单独的。开始的时候由于我先入为主的把它的作用看成了service的base类,理解起来偏差很远了。这种设计很好吗?明明是工厂还不告诉你?asio的继承关系还是比较简单的,能用模板组合的就代替了继承,这点很欣赏,复杂的继承关系很要命。命名空间的使用我还是不擅长,基本没用过。内部模块的拆分名字空间也是很有用的,就像代码中的大括号一样。

  我知道一个网络框架是很复杂的,根本不像读代码这么简单,IOCP的资源回收问题就搞了我一天,再有多线程在里面搅和,想写一个健壮的扩展性强的框架很难的。asio本身还是要受制于通用性的要求,细节上还有优化的空间。

原创粉丝点击