go context专题(一)- go 并发编程基础设施

go 并发编程基础设施

go的并发编程是其最大的特点,go为并发编程提供了两种支撑,一种是在语言层面的支撑,一种是在库的方面的支撑。下面分别做下介绍。

go语言层面并发支撑

  • go 关键字
    go这个关键字提供一个语法糖,用来启动一个goroutine

  • chan
    chan 是goroutine进行通信的基本方式,go的编程stype是不要通过共享内存来通信,而是通过通信来共享内存。

  • select
    1. 实现多个chan的扇入和扇出功能
    2. select closed chan broadcast 机制

  • sync.WaitGroup
    用于goroutine之间的同步等待

上述的是个go在语言层面对并发提供的所有支持。

go标准库层面支撑–context

go中的goroutine之间没有父与子的关系,也就没有所谓子进程退出后的通知机制,多个goroutine都是平行的被调度, 多个goroutine怎么协作工作涉及几个方面:通信,同步和等待,通知退出三个方面。
通信方面:chan 通道当然是goroutine之间通信的基础,注意这里的通信主要是指程序的主要数据通道。

同步和等待: 不带缓冲的chan提供了一个天然的同步等待机制;当然sync.WaitGroup也为多个goroutine协同工作提供一种同步等待机制。

通知退出
通知:这个通知通常和第一个通信方面不一样,这个通知特指不是主流的业务数据,它可能是元数据,可能是一种异常的通知数据。要处理这个也好办,大不了我在输入端绑定两个chan ,一个用于业务流数据,一个用于异常通知数据,然后通过select收敛进行处理。这个也可行,但这样毕竟比较费劲,不是一个通用的解决办法。
退出:goroutine之间没有父子关系,如何通知goroutine进行退出,担任也可以通过一个单独的chan可以做到,利用select closed chan broadcast 机制,比如检测到一个chan被关闭,就意味着收到通知,准备退出。

在go语言提供的层面上处理通知和退出有点繁琐,有时goroutine调用goroutine,然后goroutine又调用了新的goroutine形成一个调用链条,我怎么通知一个调用链的goroutine退出,这如果依靠语言层面的支持显然比较难处理。为此go 1.7提供了一个标准库context来解决两个问题:退出通知和元数据传递。
context库的设计目的就是跟踪 goroutine调用树,并在在这些调用树中传递通知和元数据。这个目的清楚了,后续有一门专门的文章介绍conetxt相关信息。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值