多线程处理的服务器端程序,为何有一个客户端网络慢就导致服务器端效率下降?

来源:互联网  时间:2016/8/10 12:31:34

关于网友提出的“ 多线程处理的服务器端程序,为何有一个客户端网络慢就导致服务器端效率下降?”问题疑问,本网通过在网上对“ 多线程处理的服务器端程序,为何有一个客户端网络慢就导致服务器端效率下降?”有关的相关答案进行了整理,供用户进行参考,详细问题解答如下:

问题: 多线程处理的服务器端程序,为何有一个客户端网络慢就导致服务器端效率下降?
描述:

先说一下程序的运作方式:
服务器端有一个监听网络端口的线程,如果有客户端连接就Accept,然后将这个Socket的句柄传递给给线程池处理,线程池中有多个工作线程,每个工作线程接受Socket句柄后,进行任务处理,然后以同步的方式(CSocket)类发送数据给客户端。
在局域网内进行测试,有五台机器进行访问,服务器端每秒钟可以响应客户端的50次连接任务(包括向客户端发送数据),但如果有一个客户端连接速度很慢的话,则每秒钟完成的连接任务不到10个,其余的都被堵塞住了。
怀疑是由于慢的客户端连接过来,监听线程的Accep会花费较长时间,经过程序调试,发现这个时间也是很快。只是从客户端发送过来到达服务器端时间长,但这个时间长为什么会阻塞监听线程Accept其他客户端连接。
不知大家碰到这个问题怎样解决,原因是什么?


解决方案1:

accept动做的确是一个排队的动作
如果你需要在连接上尽快响应,用AcceptEx
另,每个客户端开一个线程的方法不可取,建议看看完成端口模型

解决方案2:

我也正在研究各种I/O模型,谈谈看法。
如果你的服务器是单CPU的,则虽然应用程序是多线程,其实在一个线程运行时,
其他线程是分不到CPU时间的,还是有个排队的过程,只是线程调度机制
平时不会让我们感到这种情况。
但如果某个客户端速度慢,并且采用阻塞方式,它必然占用(独占)大量CPU时间,
而使其他客户受到影响。
还是建议使用非阻塞方式,简单地做,将继承的CSocket改为CAsyncSocket()即可。

解决方案3:

阻塞,例如listen状态的SOCKET,是不占CPU时间的。
但一个运算量大的线程会拖慢整台电脑。

上一篇在CMAINFRAME中用winsock的问题,急救!!!!!!
下一篇为什么找不到#include头文件??
明星图片
相关文章
《 多线程处理的服务器端程序,为何有一个客户端网络慢就导致服务器端效率下降?》由码蚁之家搜集整理于网络,
联系邮箱:mxgf168#qq.com(#改为@)