conexec is a concurrent toolkit to help execute functions concurrently in an efficient and safe way. It supports specifying the overall timeout to avoid blocking.
Generally it can be set as a singleton to save memory. There are some example to use it.
Actuator is a base struct to execute functions concurrently.
opt := &Options{TimeOut:DurationPtr(time.Millisecond*50)}
c := NewActuator(opt)
err := c.Exec(
func() error {
fmt.Println(1)
time.Sleep(time.Second * 2)
return nil
},
func() error {
fmt.Println(2)
return nil
},
func() error {
time.Sleep(time.Second * 1)
fmt.Println(3)
return nil
},
)
if err != nil {
// ...do sth
}
Pooled actuator uses the goroutine pool to execute functions. In some times it is a more efficient way.
opt := &Options{TimeOut:DurationPtr(time.Millisecond*50)}
c := NewPooledActuator(5, opt)
err := c.Exec(...)
if err != nil {
// ...do sth
}
Use custom goroutine pool
c := NewPooledActuator(5).WithPool(pool)
done := Exec(...)
if !done {
// ... do sth
}