摘要: 一 什么是工作池 缓冲信道的重要应用之一就是实现[工作池]。 工作池就是一组等待任务分配的线程。一旦完成了所分配的任务,这些线程可继续等待任务的分配。 我们会使用缓冲信道来实现工作池。我们工作池的任务是计算所输入数字的每一位的和。例如,如果输入 234,结果会是 9(即 2 + 3 + 4)。向工作 阅读全文
posted @ 2022-03-12 22:29 刘清政 阅读(130) 评论(0) 推荐(0) 编辑
摘要: 一 传统并发和基于消息传递的并发 在多核CPU机器下,为了充分利用计算机的资源,我们需要进行并发编程 1.1 传统并发模型 多线程编程,就是传统的并发编程模式 传统的多线程编程,使用的是ShreadMemory(共享内存)的方式,来实现的 有并发的地方就有竞争,传统多线程的并发模式使用lock(锁) 阅读全文
posted @ 2022-03-12 15:50 刘清政 阅读(311) 评论(1) 推荐(2) 编辑
摘要: 一 GMP原理解析 操作系统的线程会被操作系统内核调度时会挂起当前执行的线程并将它的寄存器内容保存到内存中,选出下一次要执行的线程并从内存中恢复该线程的寄存器信息,然后恢复执行该线程的现场并开始执行线程。从一个线程切换到另一个线程需要完整的上下文切换。因为可能需要多次内存访问,索引这个切换上下文的操 阅读全文
posted @ 2022-03-12 15:49 刘清政 阅读(167) 评论(0) 推荐(0) 编辑
摘要: 一 问题引出 在某些场景下我们需要同时从多个通道接收数据。通道在接收数据时,如果没有数据可以接收将会发生阻塞。你也许会写出如下代码使用遍历的方式来实现: for{ // 尝试从ch1接收值 data, ok := <-ch1 // 尝试从ch2接收值 data, ok := <-ch2 … } 这种 阅读全文
posted @ 2022-03-12 15:48 刘清政 阅读(180) 评论(0) 推荐(0) 编辑
摘要: 一 临界区 有时候在Go代码中可能会存在多个goroutine同时操作一个资源(临界区),这种情况会发生竞态问题(数据竞态)。类比现实生活中的例子有十字路口被各个方向的的汽车竞争;还有火车上的卫生间被车厢里的人竞争 临界区:当程序并发地运行时,多个 [Go 协程]不应该同时访问那些修改共享资源的代码 阅读全文
posted @ 2022-03-12 15:48 刘清政 阅读(100) 评论(0) 推荐(0) 编辑
摘要: 一 介绍 代码中的加锁操作因为涉及内核态的上下文切换会比较耗时、代价比较高。针对基本数据类型我们还可以使用原子操作来保证并发安全,因为原子操作是Go语言提供的方法它在用户态就可以完成,因此性能比加锁操作更好。Go语言中原子操作由内置的标准库sync/atomic提供。 二 atomic包的方法 方法 阅读全文
posted @ 2022-03-12 15:48 刘清政 阅读(66) 评论(0) 推荐(0) 编辑
摘要: Go的运行时包runtime中包含了一些列的可以设置go运行时的环境的函数,比如运行最大有多少逻辑处理器(P),最多可以创建多少OS线程(M)等 // 常量 GOOS:目标操作系统 // 方法 // 1 GOROOT():返回本机的GO路径 // 2 Version():返回Go的版本字符串。它要么 阅读全文
posted @ 2022-03-12 15:47 刘清政 阅读(198) 评论(0) 推荐(0) 编辑
摘要: 一 Timer 时间到了,执行只执行1次(延迟任务) package main import ( "fmt" "sync" "time" ) //timer 只能按时触发一次,可通过Reset()重置后继续触发。 func main() { var wg sync.WaitGroup timer:= 阅读全文
posted @ 2022-03-12 15:47 刘清政 阅读(69) 评论(0) 推荐(0) 编辑
摘要: 一 介绍 开发命令行程序时,经常需要接受命令行传入的参数 如这种 运行程序时,传入参数,app.exe -name=lqz age=99 flag包提供了参数处理的功能,官方文档地址:https://golang.google.cn/pkg/flag/ 二 使用方式一(flag.String fla 阅读全文
posted @ 2022-03-12 15:37 刘清政 阅读(100) 评论(0) 推荐(0) 编辑
摘要: fmt包实现了格式化I/O。主要分为向外输出内容和获取输入内容两大部分 一 标准输出 标准库fmt提供了以下几种输出相关函数。 1.1 Print Print函数直接输出内容 Printf函数支持格式化输出字符串 Println函数会在输出内容的结尾添加一个换行符 func Print(a ...i 阅读全文
posted @ 2022-03-12 15:37 刘清政 阅读(536) 评论(0) 推荐(0) 编辑
摘要: 1-Go介绍和开发环境 1-开发环境-Go语言介绍 2-开发环境-Go环境搭建 3-开发环境-GOPATH和gomod 4-开发环境-编辑器选择和安装 5-开发环境-第一个HelloWorld 2-Go变量和基础数据类型 1-go基础-关键字和保留字 2-go基础-内置类型和内置函数 3-go基础- 阅读全文
posted @ 2022-03-12 02:21 刘清政 阅读(2855) 评论(0) 推荐(1) 编辑
摘要: 一 rand 介绍 在Golang中,有两个包提供了rand,分别为 "math/rand" 和 "crypto/rand", 对应两种应用场景 "math/rand" 包实现了伪随机数生成器。也就是生成 整形和浮点型 "crypto/rand" 包实现了用于加解密的更安全的随机数生成器 二 mat 阅读全文
posted @ 2022-03-12 02:17 刘清政 阅读(468) 评论(0) 推荐(0) 编辑
摘要: 一 反射介绍 反射就是程序能够在运行时检查变量和值,求出它们的类型 反射就是在运行时动态的获取一个变量的类型信息和值信息 反射是指在程序运行期对程序本身进行访问和修改的能力。程序在编译时,变量被转换为内存地址,变量名不会被编译器写入到可执行部分。在运行程序时,程序无法获取自身的信息。 支持反射的语言 阅读全文
posted @ 2022-03-12 01:39 刘清政 阅读(221) 评论(0) 推荐(0) 编辑
摘要: 一 Context是什么 1.1 介绍 Context,翻译为"上下文",context包定义了Context接口类型,其接口方法定义了跨API和进程之间的执行最后期限、取消信号和其他请求范围的值 在并发程序中,由于超时、取消操作或者一些异常情况,往往需要进行抢占操作或者中断后续操作 context 阅读全文
posted @ 2022-03-12 01:39 刘清政 阅读(813) 评论(0) 推荐(0) 编辑
摘要: 一 exec介绍 有时候我们的go程序需要执行外部的命令,比如执行linux shell命令,一个其他语言编写的二进制文件,我们都可以通过调用go语言的exec包的函数来执行。 1.1 exec 函数和Cmd的方法 func Command(name string, arg ...string) * 阅读全文
posted @ 2022-03-12 01:38 刘清政 阅读(340) 评论(0) 推荐(0) 编辑
摘要: 一 os介绍 os 包提供了不依赖平台的操作系统函数接口。错误处理设计为go 风格,失败的调用会返回错误值而非错误码。通常错误值里包含更多信息 1.1 os基础操作 //获取主机名 os.Hostname() //获取当前目录 os.Getwd() //获取用户ID os.Getuid() //获取 阅读全文
posted @ 2022-03-12 01:38 刘清政 阅读(206) 评论(0) 推荐(0) 编辑