28
digitalocean.com Go Generate Pipelines

go generate pipeliner

Embed Size (px)

Citation preview

Page 1: go generate pipeliner

digitalocean.com

Go Generate Pipelines

Page 2: go generate pipeliner

Pipelines?

Page 3: go generate pipeliner

Pipelines• https://blog.golang.org/pipelines

• concurrency pattern

• “stages connected by channels"

Page 4: go generate pipeliner

Pipelines• produce a channel of stuff

• creates at least one goroutine

• source -> [middle] -> [middle] -> sink

Page 5: go generate pipeliner

Example

• https://play.golang.org/p/4Awrr2PgFo

Page 6: go generate pipeliner

Pattern• directional channels

• goroutine

• close what you create

• for/range to completion (previous stage closes)

Page 7: go generate pipeliner

Concurrency• increase the concurrency by stage

• easy to add

• https://play.golang.org/p/_qQVZ0Rh73

Page 8: go generate pipeliner

Generators vs Pipeline• generators create values when you ask for them

• pipeline produce values before you ask for them

• https://play.golang.org/p/R_XHMu1jBz

Page 9: go generate pipeliner

Real Program Concerns• leaking goroutines

• cancelation

• errors

Page 10: go generate pipeliner

Leaking Goroutines• every goroutine must terminate!

• pipelines create many goroutines

• https://play.golang.org/p/jUZIv6H4l2

Page 11: go generate pipeliner

Cancelation Strategies• exit program

• close source stage let downstream drain naturally

• close all stages

Page 12: go generate pipeliner

Exit program

• easy

• really really easy

Page 13: go generate pipeliner

Close source & drain downstream

• source closing trickles down to consumers

• all goroutines can exit

• https://play.golang.org/p/pRpNspMG2z

Page 14: go generate pipeliner

Close all stages• `out <-` must be interruptible everywhere

• every channel producing function provided “done”

• https://play.golang.org/p/Rd-hEVic0O

Page 15: go generate pipeliner

Errors• can happen anywhere

• second output channel

• https://play.golang.org/p/aUv5MrD7Bj

Page 16: go generate pipeliner

Errors Take 2• https://godoc.org/golang.org/x/net/context

• need a “pipeline context”

• signal done and place to write errors

• WIP idea

• https://play.golang.org/p/-sn3QGpc7X

Page 17: go generate pipeliner

Pipelines• `out <-` always interruptible by `done`

• close what you create

• error channel/pipeline context

• often repetitive…

Page 18: go generate pipeliner

Go Generate

Page 19: go generate pipeliner

Go Generate• since go1.4

• “comments” in your go project

• //go:generate [command] [args…]

Page 20: go generate pipeliner

Just a command• generate say hi (for fun)

• generate rm -fr / (for evil)

• generate printenv (for understanding)

Page 21: go generate pipeliner

Not a shell…

• go:generate echo $EDITOR > /tmp/nope

• go:generate cat /tmp/file | grep something

Page 22: go generate pipeliner

But shellish…• $GOFILE

• $GOPACKAGE

• $GOARCH

• $GOOS

• go:generate something -out=$GOARCH_something.go

Page 23: go generate pipeliner

Meant to write files• stderr for communicating to the user

• silent in proper operation

• side effect (file) then committed to repository

• can also generate _test.go file

Page 24: go generate pipeliner

Pipeliner

Page 25: go generate pipeliner

My common pipelines• batch(<-chan Event) (<-chan []Event)

• flatMap(<-chan gzipfile) (<-chan Event)

• from([]Event) (<-chan Event)

Page 26: go generate pipeliner

Pipeliner• side-project

• saves me time

• may annoy you (bad error messages)

• github.com/supershabam/pipeliner

Page 27: go generate pipeliner

digitalocean.com

close(talk)

Page 28: go generate pipeliner

digitalocean.com

questions?