
go
飞凡可期
Stop dreaming,start doing
展开
-
go牛刀小试之互斥锁 vs 状态协程
互斥锁/*目的:通过大并发读写同一个map变量,来展示go的大并发能力;实现:设定go map变量,互斥锁Mutex, 改100个读协程,10个写协程; atomic纪录读写总次数;方法:sync.Mutex{}, map [int] int ; */package mainimport ( "fmt" "math/rand" "sync" "sync/atomic" "time")func main() { var state = make(map [int] in原创 2020-11-14 19:06:03 · 134 阅读 · 0 评论 -
go牛刀小试之原子计数: 大并发的奇怪问题,最终读取的数早一点读和晚一点可能不一样
说明大量并发的操作有可能超出计算机的读写能力;所以最终完成后的,读取的操作未必是最终状态(最后一波数可能在CPU缓存里,没有刷到内存中)code/*目标:大量并发发生,如何安全修改状态;以原子计数器(原子钟?)为例;方法:var ato uint64; 大并发中,使用atomic.add修改,安全改变状态;回顾:sync.WaitGroup使用; 1 定义var wg wg; 2 wg.add() 3 routine:wg.done() 4 main: wg.wait() */packag原创 2020-11-10 18:01:49 · 270 阅读 · 0 评论 -
go牛刀小试之waitGroup等待协程完成(多组同步),速率控制
WaitGroup 完成所有协程/*目标:利用sync包中的waitGroup对象来 等待各个协程gorutine完成;方法:1) 定义变量sync.WatiGroup 2)传递给go routine,并每传递一次,waitgroup++, 3)go rutine内部设置延迟万层 defer wg.Done()函数4)主线程中wg.Wait()总结:设立外套Group 》给go routine刷计数器 》 内部设置延迟完成,返回才减数 》等待线程等;典型的set-wait模式在一个组应用(关键原创 2020-11-10 17:14:12 · 359 阅读 · 0 评论 -
go牛刀小试:go的打点器ticker,可停止
codepackage main// ticker 打点器,import ( "fmt" "time")func main() { ticker := time.NewTicker(400 * time.Millisecond)//microSecond //打点间隔500ms done := make(chan bool) //双通道 选择 打点,或者完成结束; go func() { for { select { case tick := <- tick原创 2020-10-20 08:18:33 · 408 阅读 · 0 评论 -
go小试牛刀-select通道选择和超时处理
通道选择//go小试牛刀-s通道选择package mainimport ( "fmt" "time")func main () { msgch1 := make(chan string) msgch2 := make(chan string) go func(){ time.Sleep(time.Second * 1) msgch1 <- "1 goroutine" fmt.Println("first msg tx ed") }() go func() {原创 2020-10-11 12:25:00 · 194 阅读 · 0 评论 -
go channel 协程同步小例子
目的程序完成有步骤依赖,时序关系,存储关系的需要阻塞-同步等待方法1 正常同步package main//练习协程goroutine之间的协同(同步),同步一定是降低效率的,//异步和并发才可以提升性能;但是流程上,许多依赖的接口和顺序执行,//储存的依赖关系,必须要同步和等待机制;import ( "fmt" "time")func routineWork(chFlag chan bool) { fmt.Println("Start working...") time.Sl原创 2020-10-07 10:56:00 · 339 阅读 · 0 评论 -
go牛刀小试:切片/递归/接口
slicepackage mainimport "fmt"type Book struct { title string publisher string price int subject string bookID int}func printSlice(x []int) { fmt.Printf("len=%d, cap=%d, slice=%v\n", len(x), cap(x),x)}func main() { fmt.Println("hello!") b原创 2020-09-20 12:33:58 · 241 阅读 · 0 评论