当前位置:  技术问答>linux和unix

是选择多线程还是I/O复用呢?

    来源: 互联网  发布时间:2017-03-05

    本文导语:  在Linux下编写多用户和服务器连接传递数据的程序,在服务器端是使用多线程编程呢,还是用I/O复用呢?最后这个程序还要移植到arm开发板上。请问哪种方案比较好?谢谢! | 这个主要受程序...

在Linux下编写多用户和服务器连接传递数据的程序,在服务器端是使用多线程编程呢,还是用I/O复用呢?最后这个程序还要移植到arm开发板上。请问哪种方案比较好?谢谢!

|
这个主要受程序需求影响,如果业务逻辑是阻塞的,你觉得I/O复用还能用吗? 很明显用不上了。

如果条件允许使用I/O复用,那么当然I/O复用比多线程效率要高N倍了。

最后,多线程和I/O复用只是两种系统接口,不是互斥关系,你可以同时使用,而且这种情况是很普遍的。

比如:

一个服务端接受客户端上报的日志,并存入数据库,还会接受客户端的日志查询,将数据库查询结果返回。

要是你,你怎么思考这个架构?

1,Mysql查询接口都是阻塞接口,肯定不能和网络I/O同线程。
2,基于1的考虑,Mysql查询逻辑挪到线程里并发的做,一个线程同一时刻执行一个阻塞的Mysql查询。
3,网络I/O线程采用I/O复用,对于每一个请求,将其派发到Mysql线程池进行处理,Mysql线程池将查询数据等结果集返回到网络I/O线程。

楼主可能对2,3步的编码细节有疑惑,简单给你说两句,你自己思考一下:

任务派发:Mysql线程池epoll监听pipe,网络I/O线程得到某client请求后遍历线程池,找一个排队任务最少的线程,将任务push给该线程的队列,向该线程pipe写1字节作为事件通知,该client进入等待结果集状态(在收到结果集前不会Push第二个Mysql请求)。

任务完成:Mysql线程完成一个client的一个Mysql请求,需要将结果集push回网络I/O线程。道理一样,网络I/O线程epoll pipe,Mysql线程push结果集到队列,向pipe写1字节通知I/O线程,于是I/O线程取出结果集,找到对应的client,修改client状态为完成查询并将结果集写给client。

此后,继续从client读请求,push给线程池,线程池push回I/O,就这么一个过程。

编码细节就是粘包问题以及状态机,包括正确的使用epoll非阻塞编程这些基础功。

|
如果I/O复用能够达到足够的性能,就没必要上多线程,这个决定权在你自己以及产品的需求

|
个人感觉用I/O复用吧,多线程用的不好就可能有导致整个程序崩溃的风险。

    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • CPU如何知道CS寄存器内装的是LDTR指向的描述符表的段选择符还是GDTR指向的描述符表的段选择符呢?
  • 有什么办法让KDE注销时选择注销、重启还是关机?
  • Linux/Unix的功能??选择windows还是linux?
  • 犹豫中……,到底是选择ASP,还是JSP?
  • 请问各位PASS了SCJP的兄弟姐妹们,考试的选择题目会提示是单选还是多选么?
  • 找工作,选择百度,还是新浪?
  • 我装了多系统,现在把linux删了,但是开机还是有linux 要你选择系统的画面,怎样让我的机子不显示这个画面啊~~??
  • 请问as4 u4安装时选择SQL数据库包,是不是还是没有把mysql安装上???谢谢!!
  • 唉!不知如何去选择:是学习WINDOWS编程还是LINUX,请大家发表一些看法
  • 想知道该如何设置才能使 netterm 进行自动登录 ?我查了资料,但无果。 有人给我答案:{不要输入用户名和密码的那种功能?选择地址簿-〉选择登录巨集文件(我用的是中文版,不知道是谁翻得这么烂)。选一个类似的文件改改就是了。}我还是不明白如何操作 ?
  • 请教:solaris下如何打印文件,需要支持选择纸张类型和选择黑白彩色! iis7站长之家
  • 关于选择Linux还是Unix和安装问题?
  • 我该选择个人版,服务器版,还是工作站版安装呢
  • 选择TCP还是UDP?
  • 问大家一个非技术的问题:北京和上海那的开发坏境好一些,生活环境好一些,选择去上海还是北京?
  • 关于去这个小公司实习?还是在实验室研究课题?的选择!
  • vmware下fedora忘记root密码,修改成功后在登陆界面时选择其他用户,用root登陆还是提示密码错呢?用另外一个账户登陆系统后,su可以切换到root
  • 选择Linux(Unix)还是Windows?
  • 在red hat linux 9为显卡ATI RADEON 9600装好了驱动,但配置显示器时还是只能选择linux缺省的显卡驱动,选ATI的,那么重启后就会出错?该
  • c#通过委托delegate与Dictionary实现action选择器代码举例
  • 请教:solaris下如何打印文件,需要支持选择纸张类型和选择黑白彩色!
  • linux哪个版本好?linux操作系统版本详细介绍及选择方案推荐
  • 怎样使文件选择器可以选择多个文件?
  • CSS 2和CSS 3选择器详解
  • 在选择gone为默认图形界面后如何选择kde?
  • 我在安装 redhat7.2 的时候选择了 GNOME 界面,启动的时候选择了图形界面启动,请问如何更改?
  • 各位能不能说选择Linux不选择Windows的理由?
  • 编译了lilo之后,重启到选择哪个系统的时候,不是原来的选择画面,我想改回去,如何改
  • Jqgrid设置全选(选择)及获取选择行的值示例代码
  • vim块选择,可以用长方形的方式选择数据:ctrl+v怎么没有效果呢。我是linux环境的。
  • **** 高分, 请问在Java中如何做一个文件选择对话框和目录选择对话框? ***


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3