golang工程实践:协程与并发| 青训营笔记

128 阅读1分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的的第2篇笔记。

协程是轻量级用户态线程,以下是协程与线程一些对比: 1.线程只能并发,而协程可以并行。 2.创建一个线程,虚拟机会向os请求创建;创建一个协程,则可以通过编译语言自身来完成。

例子执行两个无依赖的sql查询:sqlA和sqlB

线程执行sqlB同时另起一个线程执行sqlA,每个线程分别请求数据库服务。大多数情况两个线程只是在等待数据库服务响应,处于阻塞等待状态。

主线程执行sqlB同时主线程创建协程执行sqlA,两者都在主线程上,由主线程统一向数据库发送请求一次。 假设执行sql需要三步,请求(1ms),等待(100ms),获取响应(1ms),

线程需要:1+1+100+1+1 = 104 协程需要:1+100+1 = 102

go通过waitgroup实现并发同步

Add(), Done(), Wait()

这套功能实现一个counter,n个并发任务就会Add() n 个counter。没完成一个协程任务,就通过调用Done()提示该协程处于完成态,counter数量-1,直到counter=0代表协程全部完成,用Wait()阻塞。