再来看网游的常见玩法 , 除了排行榜这类统计和数据汇总的功能外,基本没有需要大量CPU时间的应用 。以前的项目里 , 即时战斗产生的各种伤害计算对CPU的消耗也不大 。玩家要完成一次操作,需要通过客户端-服务器端-客户端这样一个来回,为了获得高响应速度,满足玩家体验 , 服务器端的处理也不能占用太多时间 。所以,每次请求对应的CPU占用是比较小的 。
网游的IO主要分两个方面 , 一个是网络IO,一个是磁盘IO 。网络IO方面,可以分成美术资源的IO和游戏逻辑指令的IO,这里主要分析游戏逻辑的IO 。游戏逻辑的IO跟CPU占用的情况相似,每次请求的字节数很?。?但由于多人同时在线,因此并发数相当高 。另外 , 地图信息的广播也会带来比较频繁的网络通信 。磁盘IO方面,主要是游戏数据的保存 。采用不同的数据库,会有比较大的区别 。以前的项目里,就经历了从MySQL转向MongoDB这种内存数据库的过程,磁盘IO不再是瓶颈 。总体来说,还是用内存做一级缓冲,避免大量小数据块读写的方案 。
针对网游的这些特点,golang的语言特性十分适合开发游戏服务器端 。
首先,go语言提供goroutine机制作为原生的并发机制 。每个goroutine所需的内存很少 , 实际应用中可以启动大量的goroutine对并发连接进行响应 。goroutine与gevent中的greenlet很相像,遇到IO阻塞的时候 , 调度器就会自动切换到另一个goroutine执行,保证CPU不会因为IO而发生等待 。而goroutine与gevent相比,没有了python底层的GIL限制 , 就不需要利用多进程来榨取多核机器的性能了 。通过设置最大线程数 , 可以控制go所启动的线程,每个线程执行一个goroutine,让CPU满负载运行 。
同时 , go语言为goroutine提供了独到的通信机制channel 。channel发生读写的时候,也会挂起当前操作channel的goroutine,是一种同步阻塞通信 。这样既达到了通信的目的,又实现同步,用CSP模型的观点看 , 并发模型就是通过一组进程和进程间的事件触发解决任务的 。虽然说 , 主流的编程语言之间,只要是图灵完备的 , 他们就都能实现相同的功能 。但go语言提供的这种协程间通信机制,十分优雅地揭示了协程通信的本质,避免了以往锁的显式使用带给程序员的心理负担,确是一大优势 。进行网游开发的程序员,可以将游戏逻辑按照单线程阻塞式的写,不需要额外考虑线程调度的问题,以及线程间数据依赖的问题 。因为,线程间的channel通信,已经表达了线程间的数据依赖关系了 , 而go的调度器会给予妥善的处理 。
另外,go语言提供的gc机制,以及对指针的保护式使用,可以大大减轻程序员的开发压力 , 提高开发效率 。
展望未来 , 我期待go语言社区能够提供更多的goroutine间的隔离机制 。个人十分推崇erlang社区的脆崩哲学,推动应用发生预期外行为时 , 尽早崩溃,再fork出新进程处理新的请求 。对于协程机制,需要由程序员保证执行的函数不会发生死循环,导致线程卡死 。如果能够定制goroutine所执行函数的最大CPU执行时间,及所能使用的最大内存空间,对于提升系统的鲁棒性,大有裨益 。
关于go语言出现的目的和go语言基于什么的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站 。
推荐阅读
- 二战射击手机游戏下载免费,二战射击手游大全
- 怎么提升amd显卡性能,amd显卡怎么提升帧数
- 安卓手机软件多开免费,安卓手机软件多开免费软件
- 关于java代码例子50行的信息
- 包含推荐一本关于js的教材的词条
- redis集群服务器故障,redis集群模式故障切换原理
- 中山女内裤直播卖货被抓,中山女内裤直播卖货被抓视频
- php收集多个统计数据 php采集数据
- tile38和redis的区别,redis和ignite