这真的不是一个问题,我只是在寻找一些指导方针:) 我目前正在编写一些抽象的 tcp 服务器,它应该尽可能少地使用线程。
目前它以这种方式工作。我有一个正在监听的线程和一些工作线程。侦听器线程只是坐下来等待客户端连接我希望每个服务器实例都有一个侦听器线程。工作线程正在客户端套接字上执行所有读/写/处理工作。
所以我的问题是建立高效的工作流程。我遇到了一些我还不能真正解决的问题。工人代码是这样的(代码真的很简单,只是为了显示我遇到问题的地方):
List<Socket> readSockets = new List<Socket>();
List<Socket> writeSockets = new List<Socket>();
List<Socket> errorSockets = new List<Socket>();
while( true ){
Socket.Select( readSockets, writeSockets, errorSockets, 10 );
foreach( readSocket in readSockets ){
// do reading here
}
foreach( writeSocket in writeSockets ){
// do writing here
}
// POINT2 and here's the problem i will describe below
}
由于while循环再次循环,它可以顺利接受100%的CPU利用率,如果我让我的客户执行send->receive->disconnect例程,那并不是那么痛苦,但是如果我尝试保持活力,则执行send->接收->发送->重新接收,它真的吃光了所有的 CPU。所以我的第一个想法是在那里休眠,我检查是否所有套接字都发送了数据,然后将 Thread.Sleep 放入 POINT2 仅 10 毫秒,但是这 10 毫秒后会在我想接收下一个时产生 10 毫秒的巨大延迟来自客户端套接字的命令..例如,如果我不尝试“保持活动”命令正在 10-15 毫秒内执行,并且保持活动状态至少 10 毫秒会变得更糟:(
也许这只是一个糟糕的架构?可以做些什么来使我的处理器无法获得 100% 的利用率,并且我的服务器无法尽快对客户端套接字中出现的内容做出反应?也许有人可以指出一个很好的例子来说明它应该维护的非阻塞服务器和架构?