如何向Go官方提交代码-蒙卓
-- 简单 2. 新特性 -- 中等 3. bug -- 困难 4. release-blocker -- 地狱 CL类型 如何提交CL 1. typo 2. 新特性 a. 新API、新语法,不能破坏兼容性 b. 性能提升,太少的基本会被打回 c. 新硬件指令需要真实环境 3. bug a. 所有平台都没有问题0 码力 | 38 页 | 5.95 MB | 1 年前31.5 Go 语言构建高并发分布式系统实践
400台物理机,9个独⽴立集群,国内外近10个IDC 运维管理的go语⾔言编写的常驻service服务实例接近3000个。 业务场景多样: ⽀支持聊天场景业务,稳定⽀支持多款聊天业务app 单通道多app复⽤用 上⾏行通道,回调⽀支持 对智能硬件产品,提供定制化消息推送与转发服务 性能满⾜足需要: 线上单机最⾼高160w⻓长连接 (24核 E5-2630 @ 2.30GHz 64G内存 ) qps在2~5w(取 Linux Web Windows Flash Iframe for ever 写 ������/ � �� �������� ������� 长连接客户端 认证或注册的io调 用 加载离线消息 ����� 客户端关注的 阻塞io逻辑,放 心阻塞执行不 用担心阻塞线 程,调度器会 帮忙调度其他 可执行协程 ������� ��� 读 ���� �� ������ ne到了, 阻塞解除,超时出错 对于所有io操作建⽴立的fd映射到指定loop,同 时记录上下⽂文关系进⾏行回调设置,超时控制 使⽤用timefd 通过channel与其他⽤用户通信 使⽤用eventfd事件通知的⽅方式,根据epoll获取 的fd绑定的回调函数和参数进⾏行回调操作 对外的通信采取阻io或者也可以go出去,不 阻塞主循环 对外通信信全局消息list,在映射到的 eventloop上开连接池进⾏行消耗0 码力 | 39 页 | 5.23 MB | 1 年前303. Golang 在隐私计算平台建设中的实践 - 刘敬
有⼤大量量的数据序列列化以及异步转同步 的⽹网络流程代码,算法本身不不应该关 注⽹网络相关逻辑 嵌套调⽤用其他算法复杂 在需要调⽤用其他算法时(OT,SS 等),都需要⼿手动编写⼀一遍类似的流 程,嵌套调⽤用逻辑冗余度⽐比较⾼高 发起⽅方逻辑 参与⽅方逻辑 趣链科技版权所有©2016 – 2021 15 嵌套调⽤用其他算法 同步写法存在问题 算法效率低下 计算逻辑和⽹网络io是串串⾏行行的,不不相关 有⼤大量量的数据序列列化以及异步转同步 的⽹网络流程代码,算法本身不不应该关 注⽹网络相关逻辑 嵌套调⽤用其他算法复杂 在需要调⽤用其他算法时(OT,SS 等),都需要⼿手动编写⼀一遍类似的流 程,嵌套调⽤用逻辑冗余度⽐比较⾼高 ⼦子算法参与⽅方逻辑 ⼦子算法发起⽅方逻辑 创建⼦子算法任务 发送⼦子算法任务id 等待ack 调⽤用⼦子算法任务 等待接收⼦子算法任务id 加⼊入⼦子算法任务 发送ack 基于元函数出⼊入参类型,算法流程⾃自组 织执⾏行行,框架可介⼊入控制 05.解耦算法流程和⽹网络io ⽆无需再关注⽹网络通信 06.声明式的算法嵌套 ⽆无需关注嵌套算法的调⽤用时机,框架⾃自 动触发调⽤用 本地计算 元函数 嵌套调⽤用其他算法 元函数 接 ⼝口 算法流程 异常处理理 … 流 程 控 制 元函数 异步执⾏行行 元函数⼊入参 ⾃自动注⼊入 数据 异步发送 MAX0 码力 | 37 页 | 6.20 MB | 1 年前35.cgo 原理解析及优化实践
Goroutine 挂起会怎样? Golang 线程中调用 C 函数 C 函数长期阻塞运行会怎样? C 调 Go Extra M(虚拟的 M) 每个 Extra M,预先 “绑定” 一个 Goroutine 从 C 进入 Go,获取 P,从 Go 返回 C,“释放”P C 调 Go – 获取不到 P ① 进全局 G 队列,等待调度 C 线程被挂起 ② G 被调度到 P P 上执行 ③ P 让出给 C 线程 因为 G 绑定了 M C 线程恢复执行 C 调 Go – Go 需要挂 起 ① 让出 P 给其他 M C 线程被挂起 因为 G 绑定了 M ② P 让出给 C 线程 因为 G 绑定了 M C 线程恢复执行 因为 C 调用 Go 是同步 API 新建普通协程 ① lockedg 尽量少干活,尽快启动一个新的协程 newg,然后返回到 newg,然后返回到 C ② 释放的 P,会携带新建的 newg,在一个新的 Go 线程上执行 Go 调 C ① “释放”P 并没有立即执行,需要等 sysmon 来 retake 属于优化;通常 C 很快返回 ② 获取不到 P,也会将 G 放入全局 G 队列 CPU 优化 第四部分 发现过程 needm:获取 extra M,确保 go 需要的信号没有被屏蔽 dropm:释放0 码力 | 45 页 | 5.74 MB | 1 年前3Golang 101(Go语言101 中文版) v1.21.a
声明的类型一样。 但如果一个实 参值的类型和其对应的形参声明的类型不一致,则此实参必须能够隐式转换到 其对应的形参的类型。 如果一个函数带有返回值,则它的一个调用被视为一个表达式。如果此函数返 回多个结果,则它的每个调用被视为一个多值表达式。 一个多值表达式可以被 同时赋值给多个目标值(数量必须匹配,各个输出结果被赋值给相对应的目标 值)。 下面这个例子完整地展示了如何调用几个已经声明了的函数。 Time的值。 UnixNano是类型time.Time的一个方法。 我们可以把方法看作是特殊的函 数 。 方 法 将 在 Go 中 的 方 法 ( 第 22 章 ) 一 文 中 详 述 。 方 法 调 用 aTime.UnixNano()将返回从UTC时间的1970年一月一日到aTime所表示的时 间之间的纳秒数。 返回结果的类型为int64,这也是rand.Seed函数的参数 类型(注意:rand 始逻辑处理器 数量。 延迟函数调用(deferred function call) 在Go中,一个函数调用可以跟在一个defer关键字后面,成为一个延迟函数调 用。 此defer关键字和此延迟函数调用一起形成一个延迟调用语句。 和协程调 用类似,被延迟的函数调用的所有返回值(如果存在)必须全部被舍弃。 当一个延迟调用语句被执行时,其中的延迟函数调用不会立即被执行,而是被 推入由当前协程维护的一个延迟调用队列(一个后进先出队列)。0 码力 | 608 页 | 1.08 MB | 1 年前32.2.2 深入理解BFE
return rules, ok } BFE的代码组织 BFE的协程使用 BFE的回调点设置 BFE扩展模块的编写 • 配置加载 • 静态:mod_block.conf • 动态:block_rules.data, ip_blocklist.data • 回调函数编写和注册 • 定义状态变量 type ModuleBlock struct {0 码力 | 26 页 | 1.78 MB | 1 年前33.云原生边云协同AI框架实践
runtime.MaxBackOff), Name), cfg: cfg, } // 绑定LifelongLearningJob CRD资源的Add、Update、Delete对应事件的回调函数。 jobInformer.Informer().AddEventHandler(cache.ResourceEventHandlerFuncs{ AddFunc: func(obj interface{}) jobLister = jobInformer.Lister() jc.jobStoreSynced = jobInformer.Informer().HasSynced // 绑定Pod对应的增删改对应事件的回调函数。 podInformer.Informer().AddEventHandler(cache.ResourceEventHandlerFuncs{ AddFunc: jc.addPod,0 码力 | 37 页 | 2.36 MB | 1 年前34 seata-golang 分布式事务框架
布 式事务就是为了保证不同数据库的数据⼀致性。 什么是分布式事务问题? Demo 演示 整体机制: • ⼀阶段:业务数据和回滚⽇志记录在同⼀个本地事务中提交,释放本地锁和连接资源。 • ⼆阶段: • 提交异步化,⾮常快速地完成。 • 回滚通过⼀阶段的回滚⽇志进⾏反向补偿。 Seata 原理 AggregationSvc TM OrderSvc RM DB ProductSvc 8、GlobalRollbackRequest 9、BranchRollbackRequest DB Mysql Driver 原理 在每个 mysqlConn 对象中,都创建了⼀个 connCtx 对象,在调⽤ BeginTx(ctx context.Context, opts driver.TxOptions) (driver.Tx, error) ⽅法的时候,会根据 ctx 中是否具有 xid 的值来初始化 undoLog 和业务 数据⼀起提交到数据库,然后报告 tc 事务分⽀提交的状态(成功还是失败),否则执⾏正常的提交。如果 执⾏ Rollback,connCtx 有值则回滚然后向 tc 报告分⽀执⾏失败,tc 会根据这个状态回滚整个全局事务, connCtx 没有值则只需正常回滚。 Mysql driver 接⼊演示 TODO & QA 注册中⼼配置中⼼⽀持 PostgreSQL ⽀持0 码力 | 14 页 | 3.23 MB | 1 年前3Golang 101(Go语言101 中文版) v1.21.a
// 20 自增和自减操作符 和很多其它流行语言一样,Go也支持自增(++)和自减(--)操作符。 不过 和其它语言不一样的是,自增(aNumber++)和自减(aNumber--)操作没有返 回值, 所以它们不能当做表达式(第11章)来使用。 另一个显著区别是,在 Go中,自增(++)和自减(--)操作符只能后置,不能前置。 一个例子: 1| package main 2| 3| func 声明的类型一样。 但如果一个 实参值的类型和其对应的形参声明的类型不一致,则此实参必须能够隐式转换 到其对应的形参的类型。 如果一个函数带有返回值,则它的一个调用被视为一个表达式。如果此函数返 回多个结果,则它的每个调用被视为一个多值表达式。 一个多值表达式可以 被同时赋值给多个目标值(数量必须匹配,各个输出结果被赋值给相对应的目 标值)。 下面这个例子完整地展示了如何调用几个已经声明了的函数。 在Go中,当一个函数调用返回后(比如执行了一个return语句或者函数中的 最后一条语句执行完毕), 此调用可能并未立即退出。一个函数调用从返回 开始到最终退出的阶段称为此函数调用的退出阶段(exiting phase)。 函数调 用的退出阶段的意义将在讲解延迟函数(第13章)的时候体现出来。 函数调用的退出阶段将在后面的一篇文章(第31章)中详细解释。 匿名函数 Go支持匿名函数。定义一个匿名函数和声明一个函数类似,但是一个匿名函0 码力 | 821 页 | 956.82 KB | 1 年前3Golang 101(Go语言101 中文版) v1.21.a
验的程序员来说,读懂一份Go源码也不是一件难事。 目前,使用最广泛的Go编译器由Go官方设计和开发团队维护。 以后我们将称此编译 器为标准编译器。标准编译器也常常称为gc(是Go compiler的缩写,不是垃圾回 收garbage collection的缩写)。 Go官方设计和开发团队也维护着另外一个编译 器,gccgo。 gccgo是gcc编译器项目的一个子项目。 gccgo的使用广泛度大不 如gc, 0" 27| } 28| 29| func doNothing(string, int32) { 30| } 从上例可以看出,一个函数的声明可以出现在它的调用之前,也可以出现在它的调 用之后。 一个函数调用可以被延迟执行或者在另一个协程(goroutine,或称绿色线程)中执 行。 后面的一文(第13章)将对这两个特性进行详解。 函数调用的退出阶段 在Go中,当一个函数 这个例子多引入了一个math/rand标准库包。 此包是math标准库包中的一个子 包。 此包提供了一些函数来产生伪随机数序列。 一些解释: 在此例中,math/rand标准库包的引入名是rand。 rand.Uint32()函数调 用将返回一个uint32类型的随机数。 Printf函数是fmt标准库包中提供的另外一个常用终端打印函数。 一个 Printf函数调用必须带有至少一个实参,并且第一个实参的类型必须为 string。0 码力 | 591 页 | 21.40 MB | 1 年前3
共 40 条
- 1
- 2
- 3
- 4