您的位置:首页 > 编程语言

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相关信息。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  并发