Go调度器

宏观看调度器G: goroutine,每个G都代表1个goroutineM: 工作线程,是Go语言定义出来在用户层面描述系统线程的对象 ,每个M代表一个系统线程P: 处理器,它包含了运行Go代码的资源。3者的简要关系是P拥有G,M必须和一个P关联才能运行P拥有的G。调度器的功能协程需要运行在线程之上


Golang 并发模型

select 进阶nil的通道永远阻塞当case上读一个通道时,如果这个通道是nil,则该case永远阻塞。这个功能有1个妙用,select通常处理的是多个通道,当某个读通道关闭了,但不想select再继续关注此case,继续处理其他case,把该通道设置为nil即可。下面是一个合并程序等待两个输入


Go程序Dockerfile模板

模板文件# build时设置版本 --build-arg GO_VERSION=1.13,默认为go1.15ARG GO_VERSION=1.15FROM golang:${GO_VERSION} AS builderENV GOPROXY="https://goproxy.cn&quot


GO编程模式

切片,接口,时间和性能Slicetype slice struct { array unsafe.Pointer //指向存放数据的数组指针 len int //长度有多大 cap int //容量有多大}foo = make([


Golang Memory Model

一、背景1.1 一个 Code Review 引发的思考一个同学在 Golang 项目里面用 Double Check(不清楚的同学可以去百度搜下,Java中比较常见)的方式实现了一个单例。具体实现如下:package mainimport ( "fmt" &quot


Go高性能系列教程之二:性能评估和分析

Go高性能系列教程之二:性能评估和分析2. 性能评估和分析在上一节中,我们研究了对单个函数进行基准测试,这个的使用场景是在你已经提前知道瓶颈在哪里时很有用。但是,通常你会发现你并不知道性能瓶颈在哪里,你经常会问:程序为什么耗时这么久?对于上面的问题,我们需要对整个程序进行概要分析以找出程序的瓶颈在哪


Go高性能系列教程之一:基准测试

Go高性能系列教程之一:基准测试1. 基准测试在我们试图改进程序性能之前,我们首先要知道程序的当前性能。 本节主要关注使用Go testing包如何构建有用的基准测试,并且给出一些最佳实践避免踩坑。1.1 基准测试基本原则在进行基准测试之前,你必须要有一个稳定的环境以得到可重复的输出结果。机器必须是