最简单的游戏服务器只有一个进程,就是单点。如果这个过程退出,整个游戏世界都会消失。游戏服务器托管。在这个过程中,由于需要处理并发的客户端数据包,有很多选择方法:每次接收到用户会话时,都会建立一个线程。这个用户会话往往是用客户端的TCP连接来表示的,这样每次调用一个包从套接字中读写,都可以使用阻塞模式,编码直观简单。游戏客户端的线程数和连接数一样多。但是这种方案也有明显的缺点,就是服务器容易产生大量的线程,很难控制内存占用,线程切换也会造成CPU的性能损失。更重要的是,多线程下读写同一块数据需要处理锁问题,这可能会使代码变得非常复杂,造成各种死锁bug,影响服务器的稳定性。为了节省线程的创建和释放,建立了线程池。当每个用户会话建立后,应用到线程池以供处理线程使用。当用户会话结束时,线程不会退出,而是将该线程的使用“释放”给线程池。线程池可以很好的控制线程数量,防止用户激增对服务器造成连接冲击,形成排队机制。但是线程池本身的实现比较复杂,需要严格遵守“应用”和“释放”线程的调用规则,否则会出现线程泄漏,耗尽线程池。在游戏行业,为了获得高性能,使用Linux的epoll作为网络API是一种常见的选择。游戏服务器进程中最常见的阻塞调用是网络IO,所以使用epoll后,整个服务器进程可能会变得完全没有阻塞调用,所以只需要一个线程。这样彻底解决了多线程的锁问题,简化了并发编程的难度。但是“所有通话不得阻塞”的约束条件并不是那么容易遵守的。比如一些数据库API被阻塞;另外,单个进程、单个线程只能使用一个CPU,无法充分利用目前多核多CPU服务器中的CPU资源。异步编程是基于“回调”的,这就导致很多回调函数被定义,一个进程中的逻辑是用几个不同的回调函数来写的,这对代码的读取是非常不利的。对于这个编码问题,coroutine可以更好的帮助,所以现在流行异步和Coroutine的结合。无论如何,异步单线程模型仍然是许多团队的首选,因为它性能好,不需要并发思维。这是一个基于异步单线程模型的演化模型。这个模型一般有三种类型的线程:主线程、IO线程和逻辑线程。这些线程在内部都以完全异步的方式运行,它们通过一个无锁的消息队列相互通信。有不懂的请咨询秀米云服务器了解。