![](https://img-blog.csdnimg.cn/20201014180756922.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
golang
文章平均质量分 78
小屋子大侠
这个作者很懒,什么都没留下…
展开
-
golang异步协程调度原理
golang异步协程调度在1.14的go版本中,官方通过加入信号来进行协程的调度,后续就都支持了这种异步协程抢占,避免了早起的考栈调度时来检查是否执行超时的逻辑。本文简单来对比这种实现的原理。调度代码package mainimport "fmt"func main() { go func() { for i:=0;i>=0;i++{ fmt.Println(i) } }() for{}}1.12版本对比通过将该段代码放在1.12环境中运行。 GOMAX原创 2022-02-25 11:44:14 · 1625 阅读 · 0 评论 -
golang实践LSM相关内容
LSMLSM(log-structured merge-tree)是一种分层,有序,面向磁盘的数据结构,其核心思想是充分了利用了,磁盘批量的顺序写要远比随机写性能高出很多,在计算机科学中,日志结构的合并树是一种具有性能特征的数据结构,这使得它对于提供对具有高插入量的文件(例如事务日志数据)的索引访问很有吸引力。与其他搜索树一样,LSM树也维护键值对。LSM树以两个或多个单独的结构来维护数据,每种结构都针对其各自的底层存储介质进行了优化;数据在两个结构之间批量有效地同步。在日志的写入过程中通过批量顺序写会原创 2021-08-12 15:33:07 · 809 阅读 · 0 评论 -
服务注册发现与kit实践
服务注册发现在微服务的架构当中,服务发现是比较常见的一个方式来保证服务的动态上线下线的机制,可以通过封装一定的库来对某一个服务进行调用时无感知,动态管理当前提供服务的机制,这样同一个服务可以注册多个地址来提供服务,也可以对这些地址进行相应的负载均衡等操作,其中服务发现当前比较主流的一般会是zk、consul或者etcd来作为服务方来提供注册于发现服务。具体的过程抽象一下可以如下;#mermaid-svg-1drRTv9oIufg2cN8 .label{font-family:'trebuchet ms'原创 2020-11-03 11:54:34 · 334 阅读 · 0 评论 -
环形熔断器设计与gobreaker源码分析
环形熔断器本文主要是阅读微软在早些年前发表的环形熔断器的设计的文章,Circuit Breaker Pattern。该文比较详细的介绍了环形熔断器设计的背景,及解决的问题。环形熔断器设计背景在诸如云之类的分布式环境中,应用程序执行访问远程资源和服务的操作,这些操作可能由于诸如网络连接缓慢,超时,资源过量使用或暂时不可用之类的瞬时故障而失败。这些故障通常会在短时间后自行纠正,因此应准备使用功能强大的云应用程序来处理这些故障,例如使用重试模式所描述的策略。但是,也可能存在由于意外事件而导致故障的情况,这原创 2020-10-22 10:44:44 · 929 阅读 · 0 评论 -
go-kit微服务学习-官方示例stringsvc学习
kit库该库详细的文档可以参考官方文档,本文只是针对kit官网给出的stringsvc相关例子示例的学习。示例代码stringsvc1package mainimport ( "context" "encoding/json" "errors" "log" "net/http" "strings" "github.com/go-kit/kit/endpoint" httptransport "github.com/go-kit/kit/transport/http")//原创 2020-10-21 16:35:02 · 629 阅读 · 0 评论 -
golang内存分配概述
golang内存分配概述golang的内存分配机制主要类似于tcmalloc机制,来快速高效的分配与管理内存,从而高效分配与管理内存。有关 tcmalloc 的详细资料大家可参考官网,简单概括就是通过预先分配一个大的堆,每个线程都管理一块小内存的对象列表,大对象都是直接通过堆来直接管理,每个线程申请内存的时候如果小对象就直接在堆上分配,大对象就通过堆分配,每个内存都可以再堆上管理到。大家有兴趣课详细看一个官网的介绍,golang的内存分配也是按照如上原理来实现的,大概了解了tcmalloc的流程就很好理原创 2020-09-16 15:27:09 · 812 阅读 · 0 评论 -
golang垃圾回收概述
golang垃圾回收golang的垃圾回收机制已经迭代过好几次了,主要的几个演进过程如下:v1.0版本中使用标记和清除算法,需要再整个gc过程中暂定程序。V1.5版本中实现了三色标记清除的并发垃圾回收。v1.8使用混合写屏障技术提升了垃圾收集的时间。主要的三个大节点的更改如下所示,但是golang的垃圾回收的演进过程细节越来越复杂,性能也越来越好。首先,先了解一下基本的标记和清楚、三色标记清除的基本流程。垃圾回收的两种机制标记清除和三色标记清除标记清除标记清除的主要流程就是如下:暂停原创 2020-09-09 16:07:39 · 671 阅读 · 0 评论 -
golang库context学习
context库context最早的背景说明还是来源于官方的 博客,说明如下:在Go服务器中,每个传入请求都在其自己的goroutine中进行处理。 请求处理程序通常会启动其他goroutine来访问后端,例如数据库和RPC服务。 处理请求的goroutine集合通常需要访问特定于请求的值,例如最终用户的身份,授权令牌和请求的期限。 当一个请求被取消或超时时,处理该请求的所有goroutine应该迅速退出,以便系统可以回收他们正在使用的任何资源。再次背景之下,谷歌就开发了context的库,可以轻松地原创 2020-08-27 11:46:36 · 205 阅读 · 0 评论 -
简单编写一个容器
背景经过docker依赖的技术的了解,本文主要就是来动手实践一下。如何去简单的利用隔离技术来打造一个简单的容器。容器的创建过程启动根据参数启动创建子进程并进行隔离创建网络隔离文件系统进入新目录并卸载旧目录执行传入的命令根据这个思路编写如下示例代码package mainimport ( "golang.org/x/sys/unix" "path/filepath" "path" "fmt" "syscall" "os" "os/exec")func main() { sw原创 2020-07-29 11:40:52 · 619 阅读 · 2 评论 -
golang标准库http服务器处理流程
http标准库golang本身就提供了http的标志库,在golang中可以轻松的编写http服务,本文主要是因为在编写http服务的过程中,对整个处理流程不是很了解故想了解一下。示例代码package mainimport ("fmt""net/http")func hello(w http.ResponseWriter, req *http.Request) { fmt.Fprintf(w, "hello\n")}func headers(w http.ResponseWr原创 2020-07-27 12:34:25 · 854 阅读 · 0 评论 -
golang源码分析:defer流程分析
deferdefer是golang中使用的延迟调用的函数,该函数的使用场景就是如果函数执行出错(panic),也能够通过recover方式进行捕捉错误并将出错时的一些资源进行回收,如果在性能有要求的情况,并且错误能够控制的情况下还是直接避免使用该函数。defer的使用场景描述最理想情况下defer的性能对比package mainimport ( "testing")func ...原创 2020-03-31 17:20:10 · 380 阅读 · 0 评论 -
golang源码分析:编译过程词法解析的流程
golang编译由于golang作为静态语言,当使用go build时就会生成对应的编译完成之后的文件,那这个编译过程大致会做什么事情呢,在golang中的编译大致有哪些流程。golang示例代码package mainimport "fmt"func main(){ a := [10]int{2,1} fmt.Println(a)}在终端中,通过命令编译一下该语言;w...原创 2020-03-30 19:33:34 · 988 阅读 · 0 评论 -
golang源码分析:调度器chan调度
golang调度机制chan调度golang的调度策略中,碰见阻塞chan就会将该chan放入到阻塞的g中,然后再等待该chan被唤醒,这是golang调度器策略的主动调度策略之一,其中还有其他的主动调度策略包括进入调用系统调用或者主动调用Gosched时,都会发生主动调度,对应的当然也有被动调度,被动调度主要是后台线程在检查到某一个g执行的时间过长,再该g进行栈扩展(即调用函数时)就会进行被动...原创 2019-12-25 16:45:43 · 432 阅读 · 0 评论 -
golang源码分析-调度概述
golang源码分析-调度过程概述本文主要概述一下golang的调度器的大概工作的流程,众所周知golang是基于用户态的协程的调度来完成多任务的执行。在Linux操作系统中,以往的多线程执行都是通过操作系统陷入内核来创建线程并提供给操作系统进行调度,在操作系统中的线程调度可以充分利用操作系统提供的各种资源,当线程执行到阻塞或者等待操作时,操作系统会休眠对应线程直到阻塞的事情来唤醒该线程继续执行...原创 2019-12-18 15:41:22 · 662 阅读 · 0 评论 -
golang源码分析-启动过程概述
golang源码分析-启动过程概述golang语言作为根据CSP模型实现的一种强类型的语言,本文主要就是通过简单的实例来分析一下golang语言的启动流程,为深入了解与学习做铺垫。golang代码示例package mainimport "fmt"func main(){ fmt.Println("hello,world")}编写完示例代码之后,进行编译;go bui...原创 2019-12-11 17:33:14 · 774 阅读 · 0 评论 -
租约-代码实践
租约本文主要根据租约的基本原理,采用go语言实践一下,租约的基本流程。租约设计概述用例模型租约的主要机制就是为了保证在分布式环境下使得各个客户端使用的数据保持强一致性,每个客户端在查询服务器数据的时候,都在服务端存在一个租约信息,如果服务端还有租约没有到期,则客户端提交的数据修改阻塞到所有的租约过期菜可进行操作。基本的用例场景描述分为如下几种。客户端查询数据用例用例名称客户端...原创 2019-12-06 17:06:42 · 210 阅读 · 0 评论 -
对于sync.Mutex使用注意事项
1.sync.Mutex的初始化注意事项type MemProvider struct {lock *sync.Mutex //用来锁sessions map[string]*SessionStore //用来存储在内存}初始化时var lockm *sync.Mutex = new(sync.Mutex)var memProvid原创 2017-03-23 14:28:29 · 2166 阅读 · 0 评论 -
golang的临时对象池sync.Pool
今天在写码之时,发现了同事用到了sync.pool。因不知其因,遂Google之。虽然大概知道其原因和用法。还不能融汇贯通。故写此记,方便日后查阅。直至明了。正文在高并发或者大量的数据请求的场景中,我们会遇到很多问题,垃圾回收就是其中之一(garbage collection),为了减少优化GC,我们一般想到的方法就是能够让对象得以重用。这就需要一个对象池来存储待回收对象,等待下次转载 2017-03-20 08:14:11 · 1980 阅读 · 0 评论