版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Go语言及其在大并发环境下的应用张景埕/diogin
(@diogin)diogin@2012.12.08关于我程序员@360Go语言忠实追随者与实践者2010.08开始接触Go语言并喜欢上了它hello,worldFAQ:什么是Go语言?Google主导开发的一门通用编程语言,BSDLUnix之父KenThompson、Unix先驱RobPikeC+Python+Limbo(并发)编译+汇编+链接(主要是静态链接)简洁、朴素、直观的语法语法级的并发与自动化垃圾回收支持卓越的国际化与跨平台支持FAQ:为什么要发明Go语言?计算机越来越快,软件开发速度却跟不上C/C++大型项目依赖管理复杂,编译链接等操作太耗时如何充分利用多核、如何高效地进行并发编程越来越让程序员头疼没有一门现有语言同时具备快速编译、高效执行、快乐编程三个目标传统的面向对象语言太注重类型继承,过于臃肿、啰嗦内存管理、DLL地狱困扰着系统程序员FAQ:Go语言能做什么?除了编写操作系统内核及其模块之外,Go可以做各种应用级别的开发当前最适合编写各种服务器程序(Web服务器,应用服务器,游戏服务器,数据存储服务器等等)GUI桌面应用程序开发(还不成熟)手机App开发(还不成熟)教育、科学计算……FAQ:Go语言的目标是什么?同时具备静态语言的运行效率、动态语言的开发效率类型安全、内存安全优秀的并发与通信能力高效、无延迟的自动化垃圾收集高速编译与静态链接丰富、高质量的包FAQ:Go在编程语言谱系中的位置?FAQ:Go在编程语言谱系中的位置?FAQ:Go在编程语言谱系中的位置?一、Go程序运行原理、相关工具、语言规范及标准库(1)Go程序运行原理静态链接的二进制可执行程序(gc编译器)只依赖内核,完全不依赖libc/glibc/crt(意味着Go程序自己封装了系统调用)由多个包(package)联编而成,每个包在加载时进行初始化(通过init()函数),程序运行入口为main包里的main函数每个程序都带runtime包,进行运行时管理(调度、内存管理、反射、高级数据类型实现、profiling、panic/race管理及检测等)(1)Go程序运行原理:从零开始以linux/amd64为例(大体步骤):汇编例程_rt0_amd64_linux()->汇编例程_rt0_amd64()->准备g和m寄存器->命令行参数初始化->OS级别的初始化->调度器初始化(内存管理系统初始化->m初始化->并行能力探测)->runtime·main()->垃圾收集器启动->main·init()->main·main()(1)Go程序运行原理:什么是g/m?g=goroutine,m=machine(内核线程)externregisterG*g;externregisterM*m;一个m上可以跑多个g,如果一个g进行阻塞式系统调用,其它g可以调度到别的m上继续运行调度器的任务就是为g选择合适的m来运行(1)Go程序运行原理:包初始化main包依赖其它包,其它包又依赖其它包,所有的依赖形成一个有向无环图。每个包都可以有多init()函数,在main·init()阶段按深度优先的方式遍历调用以初始化所有的包,直到最后初始化main包。进入main·main()时,所有的包都完成了初始化。(1)Go程序运行原理:程序视图一个进程,内部多个goroutine并发运行,多个goroutine共享一个内核线程(machine),goroutine间通过channel进行同步或异步通信。所有goroutine共享进程虚拟内存空间程序由多个包以无环依赖的形式联接而成,进程开始运行之前全部包已完成初始化每个包有四种元素:const、var、type、func自动化的内存管理让进程无需手动管理内存释放,静态链接让进程无需担心动态链接库是否存在(2)相关工具go:编译汇编链接一体化,模拟脚本解释器等在go开发过程中需要进行的各种操作godoc:一个在本地运行的
官方网站镜像,方便随时查阅gofmt:鸡血工具,代码格式化,放进scm挂勾,可以让整个团队代码格式完全一致gotoolfix:在不同Go版本间自动升级代码文本编辑器/IDE:按自己的爱好自由选择(2)相关工具:Go标准目录结构通常每个项目有多个程序一个工程师可能同时开发多个项目Go使用一个GOPATH模拟一个项目每个GOPATH有标准的目录结构:bin/pkg/src/(3)Go语言规范概述1语法溯源:大体上属于C系,有指针(new),有引用(make),“传值”,简洁,容易上手类型后置式声明,例如:variint=123“面向对象”:用户定义的类型可以附加方法,功能复用采用的是组合而非继承“鸭子类型”:只需提供接口声明的方法,该类型就满足接口,无需显式实现该接口“多返回值”:函数可以返回多个值,错误处理不使用异常机制,而是用多返回值(3)Go语言规范概述2内存安全:数组边界检查、堆与栈不区分,不存在C里面返回栈空间的地址等陷阱++、--操作不再是表达式,而成了语句内置高级数据结构:map、closure严格的类型大小要求,保证跨平台性panic/recover/defer:对致命错误及其恢复机制的支持,对延迟调用的支持goroutine/channel/select:对并发的支持大小写区分包内元素对外部的可见性(3)Go语言词法元素源代码采用UTF-8编码(Unicode6.2标准)注释(//、/*…*/)、标识符(a,int)、关键字(if,go)、操作符(+,<-)、整数(123,0xff,0337)、浮点数(3.14,1e9)、虚数(3.14i,1e9i)、字符(’a’,‘中’)、字符串(”go”,“\n”)(3)Go语言规范:关键字(3)Go语言例子:if语句(3)Go语言例子:for语句(3)Go语言例子:switch语句(3)Go语言例子:混合(4)标准库(部分)runtime:Go程序运行时环境syscall:系统调用的封装net:网络协议栈封装net/http:HTTP协议封装os:跨平台操作系统API封装encoding/gob:Go程序进程间通信编码reflect:反射sync:同步原语strings:字符串APIbytes:字节API……其它官方网站:/项目托管:/p/go/邮件列表:
/group/golang-nuts二、Go在大并发环境下的应用
并发与并行并发是一种程序设计模式Go语言在语法层面支持并发设计并行是一种可选的程序运行优化方法并发!=并行并发模型:多进程、多线程、事件?Nginx:多进程,每个进程单线程(异步非阻塞I/O)Apache(prefork):多进程,每个进程单线程(同步阻塞I/O)PHP-FPM:同Apache(prefork)MySQL:单进程+多线程(同步阻塞I/O)Memcached:单进程+多线程+异步非阻塞I/ORedis:单进程+单线程+异步非阻塞I/OGo的并发模型?单进程,每个进程多个goroutine(同步阻塞I/O。可以有上百万个goroutine,只要你内存足够大)goroutine(运行单元)channel(通信通道,分缓冲式、非缓冲式)select语句(查看并选择可运行的通道操作)mutex,rwmutex,condition等等低级原语“Don’tcommunicatebysharedmemory.Instead,sharememorybycommunicating.——RobPike”goroutinegoroutineGo的基本并发单元单个goroutine占用5KB左右的栈空间一个普通的函数(或方法),通过go关键字进行调用,就成了个goroutine没有父子之说,全部goroutine地位平等无法在应用层获取goroutineidchannelchannelFirstclassvalueUnbuffered(同步)、buffered(异步)有向:仅接收、仅发送;或双向通道内可以发送任何firstclassvalue,包括通道自身,甚至一个函数selectselect某goroutine需要同时侦测多个channel上的事件如果没有一个channel上有事件发生,同时提供了default分支,则执行default分支实战:实时推送服务长连接(HTTP,TCP),实时传输全双工,实现上行发送、下行接收(TCP)每个长连接三个goroutine,一个负责读(阻塞在read),一个负责写(阻塞在write),一个负责管理与协调(select),三者通过channel进行内部通信系统组件Room:负责对接客户端Register:负责记录哪些用户当前连接在哪个roomSaver:存储离线消息IdGenerator:消息id生成器系统组件——room需要一个map用来记录用户与服务它的Server实例的对应关系抽象Server接口,并用HttpServer、TcpServer实现接入协议,每个Server有一个channel用于缓冲消息抽象Service层可复用API用户连接时注册在线信息到register,离线时清除定期心跳方式检测在线系统组件——registerHash(user)方式存储用户在线信息存储方式为一个HashTable(采用Gomap)提供RPC接口(传输协议为gob)性质类似redis,但方便添加逻辑系统组件——saver存储抽象层,封装后端存储全对称方式设计RPC(gob)系统组件——idGen
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024个人租车协议书模板10篇
- 视神经外伤病因介绍
- 《CC++语言程序设计案例教程》课件-第12章 模 板
- 工 程识图与制图-南京交院路桥与港航工32课件讲解
- 重庆2020-2024年中考英语5年真题回-教师版-专题06 任务型阅读
- 江苏省盐城市响水县2024-2025学年七年级上学期期中生物试题(原卷版)-A4
- 2023年工程塑料尼龙系列项目筹资方案
- 2023年街头篮球项目筹资方案
- 2023年矿用防爆电器设备项目筹资方案
- 《工业机器人现场编程》课件-任务3.2.2-3.2.3创建涂胶机器人坐标系与工作站数据
- 肛肠科患者的疼痛管理策略与实践经验
- 风电项目投资计划书
- 山东省医疗收费目录
- 感恩祖国主题班会通用课件
- 栓钉焊接工艺高强螺栓施工工艺
- (完整版)医疗器械网络交易服务第三方平台质量管理文件
- 《0~3岁婴幼儿动作发展与指导》项目一-0~3岁婴幼儿动作发展概述
- 铁总建设201857号 中国铁路总公司 关于做好高速铁路开通达标评定工作的通知
- 个人晋升现实表现材料范文四篇
- 持续质量改进提高偏瘫患者良肢位摆放合格率
- 部编版六年级语文上册期末复习课件(按单元复习)
评论
0/150
提交评论