GitHub - kamildrazkiewicz/go-flow: Simply way to control goroutines execution order based on dependencies (original) (raw)

Goflow

GoDoc License Release GoReport Travis Coverage

Goflow is a simply package to control goroutines execution order based on dependencies. It works similar to async.auto from node.js async package, but for Go.

Install

Install the package with:

go get github.com/kamildrazkiewicz/go-flow

Import it with:

import "github.com/kamildrazkiewicz/go-flow"

and use goflow as the package name inside the code.

Example

package main

import ( "fmt" "github.com/kamildrazkiewicz/go-flow" "time" )

func main() { f1 := func(r map[string]interface{}) (interface{}, error) { fmt.Println("function1 started") time.Sleep(time.Millisecond * 1000) return 1, nil }

f2 := func(r map[string]interface{}) (interface{}, error) {
    time.Sleep(time.Millisecond * 1000)
    fmt.Println("function2 started", r["f1"])
    return "some results", nil
}

f3 := func(r map[string]interface{}) (interface{}, error) {
    fmt.Println("function3 started", r["f1"])
    return nil, nil
}

f4 := func(r map[string]interface{}) (interface{}, error) {
    fmt.Println("function4 started", r)
    return nil, nil
}

res, err := goflow.New().
    Add("f1", nil, f1).
    Add("f2", []string{"f1"}, f2).
    Add("f3", []string{"f1"}, f3).
    Add("f4", []string{"f2", "f3"}, f4).
    Do()

fmt.Println(res, err)

}

Output will be:

function1 started
function3 started 1
function2 started 1
function4 started map[f2:some results f3:<nil>]
map[f1:1 f2:some results f3:<nil> f4:<nil>] <nil>