首页 > 代码库 > libevent for qt的讨论
libevent for qt的讨论
一直对Qt官方的QtNetwork模块抱有遗憾,Qt自带的网络模块用的是select模型,无法支持高并发的服务器开发。最近在网上看到有个libevent for qt的东西,它直接替换了Qt的select模型,支持epoll模型,所以就支持高并发了。这东西好啊,弥补了Qt的不足,也弥补了我的遗憾。我兴致勃勃的从网上下载了源代码(github地址:https://github.com/sjinks/qt_eventdispatcher_libevent),然后在windows上编译,结果每次都报错,不知道为什么。有人用过这个吗?求指教。
这个效果不怎么好的,我当初测试过libev做底层的,在linux下,但是效果和不使用差不多的,大并发同样有glib的erro的。也可能是我当初使用的不对吧。
针对做服务端性能不佳,最好的是不使用QT 的network模块,用其他的库做主力,然后使用Qt Core里面的一些东西代替stl和boost的。
如果还是想QT的事件循环为主,我写过一个解决方案:https://github.com/dushibaiyu/QAsioSocket
你可以测试下,这个是底层用的asio。
可以的,只是,Qt的socket不支持跨线程收发消息的。你需要用信号槽来回中转。
但是如果你用asio的socket的话是没有问题的。
如果只是Qt的话,我也写过相关的线程池的实现:https://github.com/dushibaiyu/QtTcpThreadServer
这个充分利用Qt线程和事件循环的。
这个是简单的说名:http://www.dushibaiyu.com/2013/12/qtcpserver%E5%A4%9A%E7%BA%BF%E7%A8%8B%E5%AE%9E%E7%8E%B0.html
boost::asio用起来很方便的,如果你觉得一个月学习周期。
我关注过golang。没系统学习和使用过。
至于那个效率高,纯echo的没有意义,关联业务之后,那就是开发者和架构的设计了。
理论上说是boost效率更高的。但是boost的学习曲线不好弄得。
我现在也没系统学习过boost,我封装asio是利用C++11 版的asio,可以不依赖boost的(定时器和序列化除外)。
至于你说boost大,你现在也没必要完全去学习的,根据需要着重学习吧。
我当初也用过Qt Core模块去代替boost的很多处理的。
boost的可怕不是多大,是boost的编码风格可读性较差,容易蚕食代码的,还有就是boost的api接口没有那么直观。
我当年在知乎的提问,你可以参考下:http://www.zhihu.com/question/22503121
qt的优势是功能强大,性能稍微差了点。同样功能肯定比boost差不少。
性能,差距很小。但是Qt network和boost.asio的差距是很明显的。
给你几个博客你自己感觉吧。
关于信号槽的:
http://www.dushibaiyu.com/2015/07/qt-signals-slots-connect.html
关于容器的:
http://www.dushibaiyu.com/2014/11/stl-vs-qtl-1.html
http://www.dushibaiyu.com/2014/11/stl-vs-qtl-2.html
http://www.dushibaiyu.com/2014/12/stl-vs-qtl-3.html
容器的是翻译的,没有翻译完,我e文也不是十分好。
这是原文地址,原文里面有测试的,只是要FQ才能看:
https://marcmutz.wordpress.com/effective-qt/containers/
c++17有望有I/O库,据说是基于asio提案的。
http://www.qtcn.org/bbs/read-htm-tid-60285.html
libevent for qt的讨论