游戏服务器是否为每个用户请求创建线程(如dota 2)?

Does a game server create threads for each user request (like dota 2)?

提问人:Hoarfrost Divine 提问时间:10/23/2018 更新时间:10/23/2018 访问量:214

问:

对于 100,000 个用户群和每个游戏会话 4 个用户,我们是否应该为每个请求创建新线程,例如 create_session、move_player、use_attack 等?

我想知道处理大型连接的最佳方式是什么,因为如果我们创建大量线程,上下文切换将占用大部分周期,如果没有创建线程,每个请求都必须等待前一个请求完成。

多线程 性能 会话 服务器端 大数据

评论

1赞 user2864740 10/23/2018
新式 Windows VM 可以轻松处理 10k“IO 空闲”线程。无论如何:一般来说,“否”,但“这取决于”许多因素,包括如何完成扩展和管理连接。大多数语言还具有通过线程池将 M 个“任务”多路复用到 N 个硬件线程的方法。许多线程的“更大”问题是适当的同步:将任务汇集到特定游戏(即单个游戏可能在离散线程上运行)可能是一个很好的“第一步”。
0赞 user2864740 10/23/2018
无论如何,关闭为“太宽泛”,因为没有足够的上下文。

答:

0赞 Humphrey Winnebago 10/23/2018 #1

如果您的目标是可伸缩性,我会避免使用每个连接的线程。最好有一个事件队列和一个线程池。

游戏公司可能会使用非基于连接的互联网协议,如 UDP。理论上,所有请求都可以在同一个套接字上输入,因此您只需要 1 个线程即可处理。该线程可以将工作分配给其他线程。

您可以有一个更大的线程池,可以在其中为任何线程分配任何作业。或者,您可以进一步将工作组织到特定的作业中,每个作业都有一个线程池来处理任务队列。但我不会为每个请求启动一个新线程。

如何设计线程池和任务分发系统取决于所使用的任何语言的库和应用程序要求。