早期使用asio,asio效率还可以,易用性也还可以,让我很不爽的:
asio是个万能线程池,不管什么样的工作都投递给这些工作线程,cpu利用率很高,能充分发挥多核优势。
但是为了实现这个功能,作者引入了可以让对象在多线程环境下得到控制的智能指针,因为任何时候任何一个工作都有可能从一个线程被投递到另一个线程,这种上下文传递还是很大的。
而且传递上下文用的就是bind,可以说在asio里,如果没shared_ptr和bind一行代码都写不出来。使用shared_ptr带来的问题就是智能指针的感染使得整个代码写的跟java一样,不需要关心任何对象的生存期。
使用bind带来的问题是,无数层栈帧,一个coredump10~30层是小case,加大了调试难度,我们就不考虑这么多层栈帧带来的性能损失。让我不得不放弃它。
后来自己下决心写一个比较单纯的网络库(),写这个库时参考了很多库,比如libevent,zeromq。大体上是写完了,但是需要考虑的细节真是一马车,需要大量的测试,实在不敢用。
再后来决定用zeromq,看到chinaunix上兄弟说zeromq不错。花了2个星期仔细研究了zeromq,感觉zeromq这种无锁数据结构用的很巧妙,也有很大的冲动去用。但是zeromq在我看来就是个message queue,做一些rpc很难处理,而且官方也偏向于协议的发展,
大力度地支持各种语言的bind,大力度地发展产品应用。让我一直不敢恭维的是zeromq被说成是下一代内核扩展,尽然用c++实现,暴露c接口,又做了一个cbind库,我就不明白,一个网络库,有必要用c++吗?看着里面用着各种EMEM,EAGAIN,unlikely,就感觉怪怪的。
我曾经试着包容c++的实现,把bind丢一边,然后一心扩展c++,但官方尽然把后面的bind都耦合到一起去了,我决定放弃了,也许zeromq,只适合做做message queue。
后来我就决定在libevent上扩展一下:
阅读(564) | 评论(0) | 转发(0) |