zfs-localpv/vendor/github.com/modern-go/concurrent
prateekpandey14 fa76b346a0 feat(modules): migrate to go modules and bump go version 1.14.4
- migrate to go module
- bump go version 1.14.4

Signed-off-by: prateekpandey14 <prateek.pandey@mayadata.io>
2020-06-09 22:27:01 +05:30
..
.gitignore feat(zfs-localpv): vendor packages for zfs-localpv 2019-09-18 08:44:08 +05:30
.travis.yml feat(zfs-localpv): vendor packages for zfs-localpv 2019-09-18 08:44:08 +05:30
executor.go feat(zfs-localpv): vendor packages for zfs-localpv 2019-09-18 08:44:08 +05:30
go_above_19.go feat(zfs-localpv): vendor packages for zfs-localpv 2019-09-18 08:44:08 +05:30
go_below_19.go feat(zfs-localpv): vendor packages for zfs-localpv 2019-09-18 08:44:08 +05:30
LICENSE feat(zfs-localpv): vendor packages for zfs-localpv 2019-09-18 08:44:08 +05:30
log.go feat(zfs-localpv): vendor packages for zfs-localpv 2019-09-18 08:44:08 +05:30
README.md feat(zfs-localpv): vendor packages for zfs-localpv 2019-09-18 08:44:08 +05:30
test.sh feat(modules): migrate to go modules and bump go version 1.14.4 2020-06-09 22:27:01 +05:30
unbounded_executor.go feat(zfs-localpv): vendor packages for zfs-localpv 2019-09-18 08:44:08 +05:30

concurrent

Sourcegraph GoDoc Build Status codecov rcard License

  • concurrent.Map: backport sync.Map for go below 1.9
  • concurrent.Executor: goroutine with explicit ownership and cancellable

concurrent.Map

because sync.Map is only available in go 1.9, we can use concurrent.Map to make code portable

m := concurrent.NewMap()
m.Store("hello", "world")
elem, found := m.Load("hello")
// elem will be "world"
// found will be true

concurrent.Executor

executor := concurrent.NewUnboundedExecutor()
executor.Go(func(ctx context.Context) {
    everyMillisecond := time.NewTicker(time.Millisecond)
    for {
        select {
        case <-ctx.Done():
            fmt.Println("goroutine exited")
            return
        case <-everyMillisecond.C:
            // do something
        }
    }
})
time.Sleep(time.Second)
executor.StopAndWaitForever()
fmt.Println("executor stopped")

attach goroutine to executor instance, so that we can

  • cancel it by stop the executor with Stop/StopAndWait/StopAndWaitForever
  • handle panic by callback: the default behavior will no longer crash your application