为什么go语言适合开发网游服务器端
个人觉得golang十分适合进行网游服务器端开发,写下这篇文章总结一下。从网游的角度看:要成功的运营一款网游,很大程度上依赖于玩家自发形成的社区。只有玩家自发形成一个稳定的生态系统,游戏才能持续下去,避免鬼城的出现。而这就需要多次大量导入用户,在同时在线用户量达到某个临界点的时候,才有可能完成。因此,多人同时在线十分有必要。再来看网游的常见玩法,除了排行榜这类统计和数据汇总的功能外,基本没有需要大量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出新进程处理新的请求。对于协程机制,需要由程序员保证执行的函数不会发生死循环,导致线程卡死。
大学学Python到底有啥用
Python小贴士
学Python
到底有什么用!
七大就业方向
总有一个适合你!
1Python爬虫工程师
爬虫技术就是用Python收集和爬
取互联网的信息,也是小伙伴们入坑
Python的第一驱动力。
爬虫技术之所以受宠是由干它能
大大地提高我们的工作效率。学会
Python爬虫后, 即使不做程序员的
工作也能加分不少。
(友情提示:注意法律风险)
技能要求
前端基础、Python爬虫库、JS反
爬、数据库等。
2Python数据分析师
在数据和黄金一样宝贵的时代,
对干许多公司而言,产品都建立在对
用户的分析之上。
所以, Python数据分析师也成了
目前最火的职业之一, 而Python是
目前数据分析业务中,最常用的语
言。
技能要求
统计学基础、Python的数据分析库
(Pandas、NumPy、mat plo lib) 、数
据库等。
3Web开发Python后端
Python有很多优秀的Web开发
框架, 如Flask、Django、Boot star
等,可以帮助你快速搭建一个网站。
像知平、豆瓣这样的大厂,最早
的网站都是用Python搭建的, 而国
外则更多, 如:YouTube、Insta gram
等代表世界顶级流量的大站。
技能要求
前端基础、Python基础、主流
Python Web框架(Flask、Django
等)。
4Python游戏开发
我们经常能看到在互联网上有人
分享自己制作的一些有意思的
Python小游戏, 求代码的小伙伴也
是络绎绝。
Python游戏开发的招聘集中在游
戏服务器领域,主要负责网络游戏的
服务器功能开发、性能优化等工作。
技能要求
Python、Python Web框架、
Linux、数据库、Ng in x等。
5Al人工智能工程师
人工智能是目前最火的方向之
一,薪资待遇很高,要求也相对较高。
Python是人工智能时代的首选
语言,不管是机器学习还是深度学
习,最常用的工具和框架都需要用
Python调用, 如:Numpy、pandas、
matplotlib、Py Torch等。
技能要求
统计学基础、Python、数据分析
库、机器学习、深度学习框架等。
6自动化运维工程师
运维工程师经常要监控上百台机
器的运行,或同时部署的情况。
使用Python可以自动化批量管
理服务器,起到1个人顶10个人的效
果。自动化运维也是Python的主要
应用方向之一,它在系统管理、文档
管理方面都有很强大的功能。
技能要求
Python、shell、Linux、数据库、
open pyx l库等
7自动化测试工程师
测试的工作是枯燥和重复的,在
过去,每次产品更新,都要重复测试
一遍,效率低而且容易出错。
Python提供了很多自动化测试
的框架, 如Selenium、Py test等, 避
免了大量的重复工作, Python自动
化测试也变得越来越流行。
技能要求
Python、自动化测试框架、Linux等
我们开发的不是MMORPG, 但是规模不小, 纯Golang开发 从处理客户端连接, MySQL处理到跨服, 平台SDK对接都是使用Golang开发的之前我的C++服务器框架也是完善的, 但和Golang比起来, 总是有一些问题, 比如说:1 总是感觉C++写出来的服务器要结实一些, 因为有强大的IDE(我们是在Windows开发Linux下运行), 强大的调试器(VS) Golang虽然没有这些, 但LiteIDE本身已经足够强大,没有之一2 Golang性能调优很是方便, 性能, 内存和阻塞, 3个pdf生成节点图, 几下就能找出问题所在 C++在这点上必须用专业第三方收费工具以及自己多年的经验来分析, 很是麻烦3 Golang任何错误都可以捕捉, 跨平台运行, 尤其是Linux, 比C++稳定的多 不用担心哪天挂掉4 Golang的Socket, 让你能想起当年用C语言的阻塞Socket时代 可惜操作系统的线程不能跟goroutine同日而语5 Golang语言简单, 任何语言招来, 2~3天开始生产代码, 很简单, 用的人也舒心6 Golang的语言特性很好, 没有OO的冗余, 只有复合+接口的简洁 用习惯后, 都不敢去用C#的OO, 怕继承变化需要重构7 Golang 14比前面版本好很多, gc基本没啥大问题了 只是自举的编译器编译速度下降了不少 但问题不大8 Golang写服务器, 因为阻塞+同步逻辑, 所以还是得考虑各种线程同步问题 该加锁还是要加锁, 而不是一味都用channel+goroutine来实现 逼近channel本身是由多个锁来实现的9 Golang写tcp短连接不知道比C++简单上百倍吧, 比boostasio这些封装库也简单个10来倍http连接就更简单了, 啥都给你处理了, 只管收消息就是了10 至今为止, 坑就1个, interface{} 简直是双刃剑 因为没泛型, 所以用interface{}等同于void 如果用interface{}做了map的key, 恭喜你, 迟早有一天你会调的死去活来 还更别说interface{}与nil, 一把泪啊11 看有些写法喜欢在Golang服务器里嵌入脚本 我们的服务器也嵌入有otto的JavaScript引擎, 但只用来做服务器配置, 方便部署 但是没有把JavaScript拿来做逻辑 毕竟考虑各种线程安全问题 Lua最终我们还是放弃了, 没有C++那些绑定库, 纯api编写, 都不知道是在写逻辑还是在封api12 除了服务器以外, 我们还用Golang编写机器人, 电子表格数据导出等 13 Golang开发效率很高, 一般大的游戏功能, 22人一周3~4个整完 这换C++时代, 大概也就1~2个还写不完14 部署太方便了! 编译出来的可执行文件都是零依赖 直接丢到目标机器就可以运行, 没有虚拟机之类的东西
目前最主要的便是这五种语言:
1Python:
Python是一门易读、易维护,并且被大量用户所欢迎的、用途广泛的语言。由于具有丰富和强大的库,又被称为胶水语言,Python 极其容易上手,主要源于Python有极其简单的说明文档。
Python 的应用领域分为系统编程,用户图形接口,Internet 脚本,组件集成,数据库编程,快速原型,数值计算和科学计算编程,游戏、图像、人工智能、XML 、机器人编程等等。
2Java
Java拥有跨平台、面向对象、泛型编程的特性,非常受企业的喜欢,广泛应用于企业级Web应用开发和移动应用开发。
Java发展到现在,按应用来分主要分为三大块:J2SE、J2ME、J2EE。三块应用范围不同,但却相互补充。广泛应用于PC、数据中心、游戏控制台、科学超级计算机、移动电话和互联网,同时拥有全球最大的开发者专业社群。
3C语言/C++:
C语言是一种通用的命令式编程语言,它起源于19世纪70年代,是大学里面计算机专业学的第一门编程语言,使用相当广泛,并且深远地影响了其后的几乎每一种语言。
C++最初是作为C语言的增强版出现,C++是一种静态数据类型检查的、支持多重编程范式的通用程序设计 语言。C++被用在一些知名软件中,比如Firefox、 Winamp以及Adobe programs。
目前而言,C语言主要用来开发底层模块(比如驱动、解码器、算法实现),服务应用(比如web服务器)和嵌入式应用(比如微波炉里的程序)。C++也可以做这些,不过由于C++的复杂性和标准问题,人们还是更愿意使用C来做。
4JavaScript:
JavaScript是一种基于对象和事件驱动并具有相对安全性的客户端脚本语言。听起来好像和java有些关系,然而却不是的,只不过名字像而已。
同时JavaScrip也是一种广泛用于客户端Web开发的脚本语言,常用来给HTML网页添加动态功能,比如响应用户的各种操作。JavaScript也可以用在游戏开发等方面。
5PHP:
PHP(Hypertext Processor) 是一种免费的强大的服务器端脚本语言,主要目标是允许网络开发人员快速编写动态页面,同时也被广泛应用于其他领域。
如 Web 开发并可嵌入 HTML 中去,受到web开发者的欢迎。包括Wordpress、Digg以及Facebook在内均使用了该语言。
PHP的语法利用了C、Java 和Perl,易于学习。目前PHP的应用范围已经相当广泛,尤其是在网页程式的开发上。
Java最强书单推荐抓紧学习
01、入门
《Java 核心技术卷 1》
《Head First Java》
《鸟哥的 Linux 私房菜》
为什么要学 Linux 呢因为在实际的开发工作中项目基本上都要部署到 Llilux 环境下。Windows作为服务器的很少,除了慢没别的原因。
假如能够提前掌握一些 Linux 基本操作的话,不仅简历上是加分项,工作中更能快人一步。
《Maven 实战》
《Git 权威指南》
02、进阶
《Java 编程思想》
《Java编程思想》这本书确实没得说,质量很高,但需要放在 Java 入门后再去读,这样才能真正地去理解思想。
《Netty 实战》
无论是构建高性能的 Web、游戏服务器、推送系统、RPC 框架、消息中间件还是分布式大数据处理引擎,都离不开Netty,在整个行业中,Netty 广泛而成功的应用,使其成为了 Java 高性能网络编程的卓绝框架。
《代码整洁之道》
软件的质量,不仅依赖于架构,更与代码质量息息相关。而代码的质量与其整洁度成正比关系,越整洁的代码,其质量毫无疑问的就会越高。
03、深入
《重构,改善既有代码的设计》
《重构,改善既有代码的设计》
《深入理解 Nginx》
《深入剖析 Tomcat》
《JDK 里的设计模式》
《深入浅出设计模式》
《设计模式之禅》
《Head First 设计模式》
《算法》
《大型网站系统与 Java 中间件实践》
《大型网站技术架构: 核心原理与案例分析》
《亿级流量网站架构核心技术》
04、学习方法
第一,善用搜索引擎。平常需要找资料,需要解决问题,如果自己一时半会没有方法的话,就去搜。
第二,学会提问。如果搜索引擎找不到答案的话,不要直接把问题抛到群里,抛给同事、领导,或者大牛,要先对问题梳理一下。
第三,善干总结和归纳。很多同学给我反馈,“二哥,怎么总是感觉记不住啊,学完就忘啊,有什么好的办法吗
C语言基础知识的方法:
了解数据结构和算法:C 语言是一种基础的编程语言,很多算法和数据结构都是通过 C 语言实现的。因此,学习数据结构和算法可以帮助加深对 C 语言的理解,并提高编程能力。
参加在线课程或培训班: 可以参加一些在线课程或培训班来系统地学习 C 语言的基础知识。例如在 Coursera、Udemy或者网易云课堂等平台上可以找到相关的课程。
学习示例代码:
阅读代码:首先需要仔细地阅读示例代码,了解代码的功能和实现方法。可以分析代码结构,查看变量和函数的命名规范、注释说明和代码格式等。
理解代码逻辑:在阅读代码的过程中,需要尝试理解代码的逻辑。可以通过画流程图或者思维导图来帮助理解代码的实现思路和算法。
实际运行代码:在阅读完示例代码之后,可以尝试将代码运行起来,并且对代码进行调试,了解代码的具体执行过程。可以通过调试器等工具来帮助理解代码的运行过程。
修改代码:尝试修改示例代码,添加新的功能或者改进原有的代码。通过修改代码来深入理解代码的实现思路和功能特性并且可以提高自己的编程能力。
参考其他资源:如果在阅读示例代码的过程中遇到了困难,可以通过查阅相关的资料来帮助理解。例如可以参考官方文档博客文章或者在线教程等。
0条评论