multithreading - 游戏服务器是否为每个用户请求创建线程(如 dota 2)?
问题描述
对于 100,000 个用户群和每个游戏会话 4 个用户,我们是否应该为每个请求创建新线程,例如 create_session、move_player、use_attack 等?
我想知道处理大型连接的最佳方式是什么,因为如果我们创建大量线程,上下文切换会占用大部分周期,如果没有创建线程,每个请求都必须等待前一个请求完成。
解决方案
如果您的目标是可扩展性,我会避免每个连接线程。最好有一个事件队列和一个线程池。
游戏公司可能会使用非基于连接的互联网协议,如 UDP。理论上,所有请求都可以进入同一个套接字,因此您只需要 1 个线程来处理它。该线程可以将工作分配给其他线程。
您可以拥有一个更大的线程池,其中可以为任何线程分配任何作业。或者您可以进一步将工作组织成特定的作业,每个作业都有一个线程池来处理任务队列。但我不会为每个请求启动一个新线程。
您如何设计线程池和任务分配系统取决于您使用的任何语言的库和应用程序要求。
推荐阅读
- swift - 运行 Kitura Docker Image 导致 libmysqlclient.so.18 错误
- c# - 如何在包含数字 1 的每一行中将数字加 1
- rust - 为动态加载的 crate 提供一致的 TypeId
- elasticsearch - elasticsearch批量加载性能问题
- r - R中的页面功能
- javascript - 为什么我不断收到 $(...).scrollSpy 未定义?
- flutter - 如何使用 Flutter 实现类似 ios 虚拟主页按钮的按钮
- qt5 - VLC 构建系统找不到 Qt5
- encoding - 如何使用 LispWorks 正确检测文件编码?
- nlp - 使用 word2vec 聚类相似词