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

来源:互联网 发布:手机淘宝等级查询 编辑:程序博客网 时间:2024/05/20 07:32

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相关信息。

原创粉丝点击