天天看点

一个golang并行库源码解析

有这样一种场景:四个任务a、b、c, d,其中任务b和c需要并发执行,得到结果1, 任务a执行得到结果2, 结果1和2作为任务d的参数传入,然后执行任务d得到最终结果。我们可以将任务执行顺序用如下图标识:

这是一个典型的多任务并发场景,实际上随着任务数量的增多,任务逻辑会更加复杂,如何编写可维护健壮的逻辑代码变得十分重要,虽然golang提供了同步机制,但是需要写很多重复无用的add/wait/done代码,而且代码可读性也很差,这是不能容忍的。

本文介绍一个开源的golang并行库,源码地址<code>https://github.com/buptmiao/parallel</code>

parallel定义了一个多任务并发实例,主要包括:<code>并发任务管道(pipes)、子任务并发实例(children)、子任务实例等待锁(wgchild)、当前并发任务实例等待锁(wg)</code>

这里pipeline实际上是一系列并发任务实例handler,每一个handler包括任务函数f, 传入参数args以及返回结果receivers