多线程 – 很多线程或尽可能少的线程?
作为一个侧面项目,我正在为一个我曾经玩过的古老游戏编写一个服务器.我试图使服务器尽可能松散耦合,但我想知道什么是多线程的一个很好的设计决定.目前我有以下操作顺序:
>启动(创建) – > 我假设平均有100个客户,因为这是游戏在任何给定时间的最大值.对于整个事情的线索是什么正确的决定?我目前的设置如下: 侦听新连接的服务器上的1个线程,在新连接上创建客户端对象并再次开始侦听. 这将导致总共102个线程.我甚至考虑给客户端2个线程,一个用于发送,一个用于接收.如果我这样做,我可以在接收器线程上使用阻塞I / O,这意味着线程在平均情况下大部分空闲. 我的主要关注点是,通过使用这个很多线程,我将占用资源.我不担心种族条件或僵局,因为这是我必须处理的事情. 我的设计是这样设置的,我可以使用一个线程进行所有的客户端通信,无论是1或100.我把通信逻辑与客户端对象本身分开了,所以我可以实现它,而不必重写很多代码. 主要的问题是:在应用程序中使用超过200个线程是错误的吗?有优势吗我正在考虑在多核机器上运行这个功能,是否需要像这样的多个内核的很多优势? 谢谢! 在所有这些线程中,大多数线程通常会被阻塞.我不期望连接每分钟超过5次.客户的命令很少出现,平均每分钟20分钟. 按照我在这里的答案(上下文切换是我正在考虑的性能,但我不知道,直到你指出了,谢谢!)我想我会去一个听众,一个接收者,一个发件人和一些杂项的东西;-) 解决方法
我写在.NET中,我不知道我的代码是由于.NET限制和API设计的,或者这是一个标准的做事方式,但是我是如何做这样的事情过去:
>将用于处理传入数据的队列对象.这应该在排队线程和工作线程之间同步锁定,以避免竞争条件. 这使得线程可以像我已经想到的那样简单但是可靠的模型.我想找到一个比这更简单的模型,但是我发现,如果我尝试减少线程模型,我开始丢失网络流中的数据或错过连接请求. 它还协助TDD(测试驱动开发),使得每个线程正在处理单个任务,并且更容易进行代码测试.拥有数百个线程可以迅速成为资源分配的噩梦,而单线程成为维护噩梦. 每个逻辑任务保持一个线程与在TDD环境中每个任务拥有一个方法相同的方式要简单得多,您可以在逻辑上分离每个应该做的事情.发现潜在的问题更容易,更容易解决它们. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |