go context专题(一)- go 并发编程基础设施
2017-08-29 20:14
337 查看
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相关信息。
相关文章推荐
- [ ECUG 专题回顾]《再谈 CERL:详论 GO 与 ERLANG 的并发编程模型差异》-许式伟(七牛云存储 CEO)
- Java 多线程与并发编程专题
- Go并发编程——channel
- go语言学习笔记之并发编程
- Java 多线程与并发编程专题
- Go基础编程:并发编程—goroutine
- Go程序设计3——并发编程
- Go基础编程:并发编程—select
- go语言学习-并发编程
- Go并发编程之同步
- Java 多线程与并发编程专题
- 21 go并发编程-下
- Go语言并发编程总结
- Go语言并发模型的2种编程方案
- Go并发编程总结
- Go 并发控制context实现原理剖析(小结)
- Go基础编程:并发编程—channel
- 并发编程专题开篇
- Go 并发编程基础(一)goroutine,channel
- 【郭林专刊】Java 多线程与并发编程专题