Golang
文章平均质量分 65
清秋-
这个作者很懒,什么都没留下…
展开
-
实现异步的日志库输出
需求分析:1.支持往不同的地方输出日志(终端还是指定的文件)2.日志分级别(DEBUG,WANRING,ERROR…)3.支持开关控制,能设置某级别以上日志才输出4.完整的日志要有时间,行号,文件名,日志级别,日志信息。5.日志文件要切割(按文件大小或者日期切割)func main() { logger := logfile.NewFileLogger("DEBUG","D:/","guoyilin",1*1024) name := "郭10" for { l原创 2021-03-15 22:38:57 · 322 阅读 · 0 评论 -
Golang的GMP内存模型和可视化调试(三)
1.go func()执行分析2.调度器的生命周期M0M0是启动程序后的编号为0的主线程,M0负责执行初始化操作和启动第一个G(初始化一些队列信息等),在之后M0就和其他的M一样了。G0G0是每次启动一个M都会第一个创建的gourtine,G0仅用于负责调度的G,G0不指向任何可执行的函数, 每个M都会有一个自己的G0runtime创建最初的线程m0和goroutine g0,并把2者关联。调度器初始化:初始化m0、栈、垃圾回收,以及创建和初始化由GOMAXPROCS个P构成的P列原创 2021-05-05 21:20:41 · 334 阅读 · 1 评论 -
Golang的GMP内存模型(二)
调度器的设计策略1 .复用线程避免频繁的创建、销毁线程,而是对线程的复用。1)work stealing机制当本线程无可运行的G时,尝试从其他线程绑定的P偷取G,而不是销毁线程。G1会单独和M1绑定,如果G1一直不执行,M1会被睡眠或者销毁。等待G1需要执行再加入本地队列。2. 利用并行GOMAXPROCS设置P的数量,最多有GOMAXPROCS个线程分布在多个CPU上同时运行。GOMAXPROCS也限制了并发的程度,比如GOMAXPROCS = 核数/2,则最多利用了一半的CPU核进行原创 2021-05-05 21:13:00 · 167 阅读 · 0 评论 -
Golang的GMP内存模型(一)
1.调度器的由来1.早期的单进程操作系统缺点:单一执行流程、计算机只能一个一个业务处理 进程阻塞所带来的CPU浪费时间2.多进程/多线程操作系统解决了阻塞问题,CPU轮询,进程切换需要保存状态,造成了巨大的时间浪费面临的问题是 线程越多,不停的切换轮询CPU,代价越大。所以在语言层面,让多个协程(任务绑定在一个线程内完成,可以减少线程切换)N:1 带来的问题是 如果一个协程阻塞,同一个线程绑定的下一个协程就会持续等待M:N 模型化解了问题,如果一个协程阻塞,可以绑定到下一个线程原创 2021-05-05 21:07:42 · 563 阅读 · 0 评论 -
Golang中defer的执行时机
1.defer的执行顺序底层是采用栈func func1() { fmt.Println("A")}func func2() { fmt.Println("B")}func func3() { fmt.Println("C")}func main() { defer func1() defer func2() defer func3()}输出 C B A2.defer和return 的顺序在Go语言的函数中return语句在底层并不是原子操作,它分为给返原创 2021-05-04 23:21:39 · 1477 阅读 · 0 评论 -
Golang互斥锁和读写锁的性能差异
1.互斥锁互斥锁是一种常用的控制共享资源访问的方法,它能够保证同时只有一个goroutine可以访问共享资源。Go语言中使用sync包的Mutex类型来实现互斥锁。 使用互斥锁来修复上面代码的问题:var x int64var wg sync.WaitGroupvar lock sync.Mutexfunc add() { for i := 0; i < 50000; i++ { lock.Lock() // 加锁 x = x + 1 lock.Unlock() // 解锁原创 2021-05-01 11:00:52 · 692 阅读 · 0 评论 -
Go mod包管理摒弃传统的Go Path开发
在 Golang1.11版本之前如果我们要自定义包的话必须把项目放在 GOPATH 目录。Go1.11版本之后无需手动配置环境变量,使用 go mod 管理项目,也不需要非得把项目放到 GOPATH指定目录下,你可以在你磁盘的任何位置新建一个项目 , Go1.13以后可以彻底不要 GOPATH了。Modules和传统的GOPATH不同,不需要包含例如src,bin这样的子目录,一个源代码目录甚至是空目录都可以作为Modules,只要其中包含有go.mod文件。如何使用go.mod?1.首先将go的版原创 2021-03-18 10:36:50 · 654 阅读 · 0 评论 -
并发编程
18. 并发编程1.生成随机数func main() { rand.Seed(time.Now().UnixNano()) 距离1970年的纳秒数 for i:=0;i<5 ;i++ { r1 :=rand.Int() //生成int64的值 r2 :=rand.Intn(10) fmt.Println(r1,r2) }}如果没有随机数种子,每次程序生成的都是5个同样的随机数,因为go bulid的时候已经生成好了,原创 2021-03-14 15:46:28 · 245 阅读 · 0 评论 -
网络编程(tcp,udp,http)
1.Go语言实现TCP通信一个TCP服务端可以同时连接很多个客户端,例如世界各地的用户使用自己电脑上的浏览器访问淘宝网。因为Go语言中创建多个goroutine实现并发非常方便和高效,所以我们可以每建立一次链接就创建一个goroutine去处理。TCP服务端程序的处理流程:监听端口接收客户端请求建立链接创建goroutine处理链接。我们使用Go语言的net包实现的TCP服务端代码如下:func process (coon net.Conn){ for { //3.与客原创 2021-03-23 11:53:56 · 211 阅读 · 0 评论