天天看點

一個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