- 博客(4)
- 收藏
- 关注
原创 并发安全和锁
有时候在Go代码中可能会存在多个goroutine同时操作一个资源,这种情况会发生数据竞态问题。举例:var x int64var wg sync.WaitGroupfunc add() { for i := 0; i < 5000; i++ { x = x + 1 } wg.Done()}func main() { wg.Add(2) go add() go add() wg.Wait() fmt.Println(x)}上面的代码中开启了 2 个gorout
2021-03-21 13:15:16 407
原创 select多路复用
在某些场景下我们需要同时从多个通道接收数据。通道在接收数据时,如果没有数据可以接收发生阻塞。你也许会写出代码使用遍历的方式来实现:for { //尝试从ch1接收值 data,ok := <-ch1 //尝试从ch2接收值 data,ok := <-ch2}这种方式虽然可以实现从多个channel接收值的需求,但是运行性能会差很多。为了应对这种场景,Go内置了select关键字,可以同时响应多个通道的操作。select的使用类似于switch语句,它有一些列case分支和一个
2021-03-19 14:41:50 506
原创 go协程池
编写代码实现了一个计算随机数的每个位置数字之和的程序,要求使用goroutine和channel构建生产者和消费者模式,可以指定启动的goroutine数量-woker pool模式。在工作中我们通常使用workerpool模式,控制goroutine的数量,防止goroutine泄露和暴涨。一个简易的workerpool示例代码如下:package mainimport ( "fmt" "time")func worker(id int, jobs <-chan int, res
2021-03-19 14:19:23 423
原创 多协程执行收集结果
##多协程执行收集结果1、先假设有一个比较耗时的任务//假设有一个比较耗时的任务func job(index int) int { //模拟耗时,延迟500毫秒 time.Sleep(time.Millisecond * 500) return index}2、使用非协程的方式,看看需要多少时间func main() { //记录当前时间 start := time.Now() //假设这个工作需要 5 次 num := 5 for i := 0; i < num; i
2021-03-15 17:10:39 238
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人