• 7726阅读
  • 12回复

libevent for qt [复制链接]

上一主题 下一主题
离线songhuirong1
 

只看楼主 倒序阅读 楼主  发表于: 2015-11-29
一直对Qt官方的QtNetwork模块抱有遗憾,Qt自带的网络模块用的是select模型,无法支持高并发的服务器开发。最近在网上看到有个libevent for qt的东西,它直接替换了Qt的select模型,支持epoll模型,所以就支持高并发了。这东西好啊,弥补了Qt的不足,也弥补了我的遗憾。我兴致勃勃的从网上下载了源代码(github地址:https://github.com/sjinks/qt_eventdispatcher_libevent),然后在windows上编译,结果每次都报错,不知道为什么。有人用过这个吗?求指教。
离线渡世白玉

只看该作者 1楼 发表于: 2015-11-29
这个效果不怎么好的,我当初测试过libev做底层的,在linux下,但是效果和不使用差不多的,大并发同样有glib的erro的。也可能是我当初使用的不对吧。

针对做服务端性能不佳,最好的是不使用QT 的network模块,用其他的库做主力,然后使用Qt Core里面的一些东西代替stl和boost的。

如果还是想QT的事件循环为主,我写过一个解决方案:https://github.com/dushibaiyu/QAsioSocket
你可以测试下,这个是底层用的asio。
离线songhuirong1

只看该作者 2楼 发表于: 2015-11-29
回 渡世白玉 的帖子
渡世白玉:这个效果不怎么好的,我当初测试过libev做底层的,在linux下,但是效果和不使用差不多的,大并发同样有glib的erro的。也可能是我当初使用的不对吧。
针对做服务端性能不佳,最好的是不使用QT 的network模块,用其他的库做主力,然后使用Qt Core里面的一些东西代替stl和boost的。
.. (2015-11-29 15:46) 

非常感谢你的回答。还有个问题想问下,server端就用一个线程专门负责监听客户端,只要有客户端连接上来就创建一个socket,然后把它保存到一个socket列表里。当这个列表里的任何一个socket收到客户端的请求时,这时server端就把要处理的任务丢到线程池里去处理。请我这种方式写的server性能如何?我就担心只有一个线程负责监听客户端的连接,如果同时有几千个客户端连接上来,server的处理速度是不是跟不上
离线渡世白玉

只看该作者 3楼 发表于: 2015-11-30
回 songhuirong1 的帖子
songhuirong1:
非常感谢你的回答。还有个问题想问下,server端就用一个线程专门负责监听客户端,只要有客户端连接上来就创建一个socket,然后把它保存到一个socket列表里。当这个列表里的任何一个socket收到客户端的请求时,这时server端就把要处理的任务丢到线程池里去处理。请我这种方式写的server性能如何?我就担心只有一个线程负责监听客户端的连接,如果同时有几千个客户端连接上来,server的处理速度是不是跟不上

可以的,只是,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



离线sevencat

只看该作者 4楼 发表于: 2015-11-30
专门开一个线程处理这些事情,想用什么库用什么库。
战争就是和平,自由就是奴役,愚味就是力量
离线songhuirong1

只看该作者 5楼 发表于: 2015-12-01
回 渡世白玉 的帖子
渡世白玉:可以的,只是,Qt的socket不支持跨线程收发消息的。你需要用信号槽来回中转。
但是如果你用asio的socket的话是没有问题的。
如果只是Qt的话,我也写过相关的线程池的实现:https://github.com/dushibaiyu/QtTcpThreadServer
这个充分利用Qt线程和事件循环的。
....... (2015-11-30 09:39) 

有时间要学习下boost,boost可以满足我的需要,只是学习boost需要比较长的时间,boost库太大了。不知道楼主用过golang没有,golang天生就支持高并发,而且语法特性非常少,学习时间比较短。就是不知道golang写的服务器程序跟boost写的,哪个性能好些。
离线sevencat

只看该作者 6楼 发表于: 2015-12-01
boost::asio用起来很方便的,如果你觉得一个月学习周期。
战争就是和平,自由就是奴役,愚味就是力量
离线渡世白玉

只看该作者 7楼 发表于: 2015-12-01
回 songhuirong1 的帖子
songhuirong1:有时间要学习下boost,boost可以满足我的需要,只是学习boost需要比较长的时间,boost库太大了。不知道楼主用过golang没有,golang天生就支持高并发,而且语法特性非常少,学习时间比较短。就是不知道golang写的服务器程序跟boost写的,哪个性能好些。 (2015-12-01 12:30) 

我关注过golang。没系统学习和使用过。
至于那个效率高,纯echo的没有意义,关联业务之后,那就是开发者和架构的设计了。
理论上说是boost效率更高的。但是boost的学习曲线不好弄得。
我现在也没系统学习过boost,我封装asio是利用C++11 版的asio,可以不依赖boost的(定时器和序列化除外)。
至于你说boost大,你现在也没必要完全去学习的,根据需要着重学习吧。
我当初也用过Qt Core模块去代替boost的很多处理的。
boost的可怕不是多大,是boost的编码风格可读性较差,容易蚕食代码的,还有就是boost的api接口没有那么直观。
我当年在知乎的提问,你可以参考下:http://www.zhihu.com/question/22503121
离线songhuirong1

只看该作者 8楼 发表于: 2015-12-01
回 渡世白玉 的帖子
渡世白玉:我关注过golang。没系统学习和使用过。
至于那个效率高,纯echo的没有意义,关联业务之后,那就是开发者和架构的设计了。
理论上说是boost效率更高的。但是boost的学习曲线不好弄得。
我现在也没系统学习过boost,我封装asio是利用C++11 版的asio,可以不依赖boost的(定时器和序 .. (2015-12-01 14:53) 

我觉得Qt的API很简洁,很优雅,这是我喜欢Qt的一个很重要的原因,再加Qt跨平台,那就更棒了。Qt的效率跟boost相比,如何?
离线sevencat

只看该作者 9楼 发表于: 2015-12-01
qt的优势是功能强大,性能稍微差了点。同样功能肯定比boost差不少。
战争就是和平,自由就是奴役,愚味就是力量
离线渡世白玉

只看该作者 10楼 发表于: 2015-12-01
性能,差距很小。但是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文也不是十分好。
这是原文地址,原文里面有测试的,只是要翻墙才能看:
https://marcmutz.wordpress.com/effective-qt/containers/
离线songhuirong1

只看该作者 11楼 发表于: 2015-12-02
回 渡世白玉 的帖子
渡世白玉:性能,差距很小。但是Qt network和boost.asio的差距是很明显的。
给你几个博客你自己感觉吧。
关于信号槽的:
http://www.dushibaiyu.com/2015/07/qt-signals-slots-connect.html
关于容器的:
....... (2015-12-01 17:13) 

C++11里面我怎么没看到有Asio这个库?难道我搞错了?
离线渡世白玉

只看该作者 12楼 发表于: 2015-12-07
回 songhuirong1 的帖子
songhuirong1:C++11里面我怎么没看到有Asio这个库?难道我搞错了? (2015-12-02 18:20) 

又不是标准库里的。asio本来就是独立的库。
c++17有望有I/O库,据说是基于asio提案的。
快速回复
限100 字节
 
上一个 下一个