作为辅助项目,我目前正在为我玩过的古老游戏编写服务器。我正在尝试使服务器尽可能松散地耦合,但是我想知道对于多线程而言,一个好的设计决定是什么?目前,我有以下操作顺序:
我假设平均有100个客户,因为这是该游戏在任何给定时间的最高人数。对于整个线程的处理,正确的决定是什么?我当前的设置如下:
服务器上的
这将导致总共102个线程。我什至考虑给客户端2个线程,一个用于发送,一个用于接收。如果这样做,则可以在接收器线程上使用阻塞I/O,这意味着在一般情况下该线程将大部分处于空闲状态。
我主要担心的是,通过使用这么多线程,我将浪费资源。我不必担心比赛条件或僵局,因为无论如何我都必须解决这一问题。
我的设计是以这样一种方式设置的:可以使用一个线程进行所有客户端通信,无论是1还是100。我已经将通信逻辑与客户端对象本身分离开了,因此我可以实现它而不必重写很多代码。
主要问题是:在一个应用程序中使用200个以上的线程是否错误?有优势吗?我正在考虑在多核计算机上运行它,是否会充分利用像这样的多核的优势?
谢谢!
在所有这些线程中,大多数将通常被阻塞。我预计连接速度不会超过每分钟5次。来自客户端的命令很少出现,平均每分钟20条。
按照我得到的答案(上下文切换是我一直在考虑的性能问题,但是直到您指出来,我才知道,谢谢!)我想我会选择一个听众,一个听众。接收者,一个发送者和一些杂物;-)
最佳答案
我使用.NET编写,因此不确定代码的编写方式是否是由于.NET限制及其API设计所致,还是不确定这是一种标准的处理方式,但这是我如何在.NET中完成此类操作过去:
这样可以使线程简化为我所知道的那样简单但健壮的模型。我很想找到一个比这个更简单的模型,但是我发现,如果我尝试进一步减少线程模型,就会开始丢失网络流上的数据或丢失连接请求。
它还有助于TDD(测试驱动开发),以便每个线程都在处理单个任务,并且更容易为测试编写代码。具有数百个线程可能很快成为资源分配的噩梦,而具有单个线程则成为维护的噩梦。
保持每个逻辑任务一个线程的方式与在TDD环境中每个任务只有一种方法的方式简单得多,并且您可以在逻辑上分离每个任务应该做什么。发现潜在问题更容易,而解决它们也容易得多。
关于multithreading - 线程多还是线程少?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/375374/