Golang 协程调度

一、线程模型 N:1模型,N个用户空间线程在1个内核空间线程上运行。优势是上下文切换非常快但是无法利用多核系统的优点。 1:1模型,1个内核空间线程运行一个用户空间线程。这种充分利用了多核系统的优势但是上下文切换非常慢,因为每一次调度都会在用户态和内核态之间切换。(POSIX线程模型(pthread),Java) M:N模型,每个用户线程对应多个内核空间线程,

[Go] gocron源码阅读-go语言web框架Macaron

gocron源码中使用的是马卡龙框架,下面这个就是安装这个框架,和一般的MVC框架很像gogetgopkg.in/macaron.v1gitclonehttps://github.com/golang/crypto.git$GOPATH/src/golang.org/x/crypto 监听80端口,使用模板引擎的简单例子 packagemain import"gopkg.in/macaron.v1" funcmain(){&#13

golang 服务诡异499、504网络故障排查

事故经过 排查 总结 事故经过 11-0112:00中午午饭期间,手机突然收到业务网关非200异常报警,平时也会有一些少量499或者网络抖动问题触发报警,但是很快就会恢复(目前配置的报警阈值是5%,阈值跟当时的采样窗口qps有直接关系)。 报警当时非200占比已经过10%并且在持续升高,根据历史规律应该很快就会恢复,我们稍微观察了几分钟(一边吃着很香的饺子一边看着手机),但

[Go] gocron源码阅读-go语言中的切片接口和类型综合

//getCommands funcgetCommands()[]cli.Command{ command:=cli.Command{ Name:"web", Usage:"runwebserver", Action:runWeb, Flags:[]cli.Flag{ cli.StringFlag{ Name:"host", Value:"0.0.0.0", Usage:"bindhost",&

[Go] gocron源码阅读-go语言的结构体

结构体类型type名字struct{},下面这段是github.com/urfave/cli包里的代码,声明了一个App的结构体类型 typeAppstruct{ //Thenameoftheprogram.Defaultstopath.Base(os.Args[0]) Namestring //Fullnameofcommandforhelp,defaultstoName HelpNamestring //Descriptionof

[Go] gocron源码阅读-go语言中数组和切片的字面值初始化语法

源码中有这么一句,这个函数要求返回的是[]cli.Command,cli.Command类型的切片,这个地方直接使用字面值初始化了一个切片返回去了 return[]cli.Command{command}   数组的字面值初始化,一般是需要指定数组的大小,可以使用...三个点来代替大小,根据后面初始化的个数来计算,下面就是字面值初始化一个数组 arr:=[...]int{1,2,3} fori,j:=rangearr{&

[开源]基于goapp+xterm实现webssh-网页上的SSH终端linux管理工具(golang)

 简析 基于goapp+xterm实现webssh-网页上的SSH终端,linux管理工具。 开源地址见文末。   特性 在网页上实现一个SSH终端。从而无需Xshell之类的模拟终端工具进行SSH连接。 可以对交互命令进行审计、记录 在页面上按一个键,就能打开一个webssh,并且自动登录,方便地管理各个服务器 可以集成到自有的后台管理体系中   下载并运行   下

Golang定时器断续器

定时器 1.定时器结构 结构定义 typeTimerstruct{ C<-chanTime//接受定时器事件的通道 rruntimeTimer } typeruntimeTimerstruct{ tbuintptr iint whenint64 periodint64 ffunc(interface{},uintptr)//NOTE:mustnotbeclosure arginterface{} sequintptr } 2.创建定时器 接口定义 funcNewTimer(dDuration)*

『Go基础』第1节 Go语言简介

1.Go语言简介 Go语言起源于2007年,并于2009年开源.Go语言是一门全新的静态类型开发语言,具有自动垃圾回收,丰富的内置类型,错误处理,并发编程等特征.

golang写业务代码,用全局函数还是成员函数

在golang中,函数划分为全局函数和成员函数,在使用的时候,有种情况,会产生一些疑惑的,就是在写业务代码的时候,使用全局函数好像会比较方便,一般业务代码,都不会复用,都是针对特定的业务进行编程,要复用的代码都会封装为功能函数了。在写业务代码的时候,使用包+全局函数的划分方式,可以将业务代码写成单例,把receive也省略掉了,简单清晰。 使用包+全局

golang实现分布式缓存笔记(一)基于http的缓存服务

目录 前言 cache缓存服务接口 cache包实现 golanghttp包使用介绍hello.go Redirect.go http-cache-server实现cacheHandler 程序测试 与redis的比较 前言 这个月我想学一下go语言,于是决定学习一个go实现的缓存服务。 首先本文基于golang的http包实现一个简单http的缓存服务,因为用golang自带的http包实现一个处理请求的服务端十分便利,我们只需要写一个简单的map保存数据,写一个http的handler处

[Go] golang原子函数实现goroutine同步

启动了两个goroutine,并完成一些工作。在各自循环的每次迭代之后,在goroutine会使用LoadInt64来检查shutdown变量的值。这个函数会安全地返回shutdown变量的一个副本。如果这个副本的值为1,goroutine就会跳出循环并终止。   packagemain import( "fmt" "sync" "sync/atomic" "time" )

[Go] golang原子函数锁住共享资源

1.atomic包里的几个函数以及sync包里的mutex类型,提供了解决方案2.原子函数能够以很底层的加锁机制来同步访问整型变量和指针3.atomic.AddInt64(&counter,1)的原理是强制同一时刻只能有一个goroutine运行并完成这个加法操作 packagemain import( "fmt" "runtime" "sync" "sync/atomic" ) &#1

[Go] golang互斥锁mutex

1.互斥锁用于在代码上创建一个临界区,保证同一时间只有一个goroutine可以执行这个临界区代码2.Lock()和Unlock()定义临界区 packagemain import( "fmt" "runtime" "sync" ) var( //全局变量 counterint64 //计数信号量 wgsync.WaitGroup //

[Go] golang缓冲通道实现管理一组goroutine工作

通道1.当一个资源需要在goroutine之间共享时,通道在goroutine之间架起了一个管道2.无缓冲通道和有缓冲通道,make的第二个参数就是缓冲区大小3.无缓冲通道需要发送和接收都准备好,否则先执行的goroutine会阻塞等待4.有缓冲的通道,在缓冲区没满之前,发送和接收动作都不会阻塞,空的时候接收才会阻塞 time.Now().Unix()当前时间戳time.Millisecond毫秒time.Sleep(1*time.Second)睡眠一秒   &#

Go语言相对于C++的优点

Go语言是Google公司在2009年开源的一门高级编程语言,它为解决大型系统开发过程中的实际问题而设计,支持并发、规范统一、简单优雅,被很多Go语言传道者誉为“互联网时代的C语言”。而C++语言诞生于1979年,可以将C++语言视为一个语言联邦,主要包含C语言(面向过程)、面向对象、STL容器和算法、范型编程(模板)4部分,它高效强大同时又臃肿复杂,目前最流行的是C++11标

使用Golang搭建web服务

如何用golang搭建一个web服务呢?菜鸟官网的goweb编程教程已经介绍了web服务器的工作原理,这里就不赘述了。 我们先看个例子:http.go packagemain import( "fmt" "io" "log" "net/http" ) funcmain(){ http.HandleFunc("/test",doRequest)//设置访问路由 e

[Go] golang结构体成员与函数类型

packagemain import( "fmt" ) //定义一个类型 typetshstruct{ //定义成员,类型是func()string testfunc()string } //定义一个函数,获取tsh类型 funcNew(fnfunc()string)*tsh{ return&tsh{ test:fn,&

[Go] golang的select多路选择功能

基于select的多路复用:1.解决如果一个channel中没有事件发过来,程序会立即阻塞,无法接收到第二个channel中的事件2.一般每一个case都代表一个通信操作,多个case会选一个能执行的3.default会默认执行,因此可以作为轮询channel来用 packagemain import( "fmt" ) funcmain(){ //定义一个缓冲通道,大小是1 ch:=make(c

[Go] golang的接口合约

接口类型1.接口类型具体描述了一系列方法的集合,实现这些方法的具体类型是这个接口类型的实例2.一个类型如果拥有一个接口需要的所有方法,那么这个类型就实现了这个接口 packagemain import( "fmt" ) //定义一个接口类型Person typePersoninterface{ //描述了一个需要实现的Say方法,返回的类型是error Say()error