Skip to content

Provide errorgroup instead of waitgroup as alternative for concurrent activity execution #461

@DerkSchooltink

Description

@DerkSchooltink

I can do something like this:

wg := workflow.NewWaitGroup()
wg.Add(2)

var wgErr error
workflow.Go(ctx, func(ctx workflow.Context) {
    defer wg.Done()
    if _, err := workflow.ExecuteActivity[any](ctx, workflow.DefaultActivityOptions, func, ...).Get(ctx); err != nil {
        wgErr = err
    }
})

workflow.Go(ctx, func(ctx workflow.Context) {
    defer wg.Done()
    if _, err := workflow.ExecuteActivity[any](ctx, workflow.DefaultActivityOptions, func, ...).Get(ctx); err != nil {
        wgErr = err
    }
})

wg.Wait(ctx)
if wgErr != nil {
    return wgErr
}

But capturing an error can be simplified by using the concept of an error group: https://pkg.go.dev/golang.org/x/sync/errgroup

It would look like this:

gctx, g := workflow.WithErrGroup(ctx)
g.Go(func(ctx workflow.Context) error {
	if _, err := workflow.ExecuteActivity[any](ctx, workflow.DefaultActivityOptions, func, ...).Get(ctx); err != nil {
		return err
	}
	return nil
})

g.Go(func(ctx workflow.Context) error {
	if _, err := workflow.ExecuteActivity[any](ctx, workflow.DefaultActivityOptions, func, ...).Get(ctx); err != nil {
		return err
	}
	return nil
})

if err := g.Wait(gctx); err != nil {
	return err
}

I can open up a PR for this to show you how it looks like. It is functionally close to the impl. of the waitgroup.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions