worker
worker is a small Go pool for func() tasks. Create it with a minimum and
maximum worker count, then submit tasks:
pool, err := worker.New(2, 8)
if err != nil {
return err
}
defer pool.Close()
if err := pool.Submit(func() { doWork() }); err != nil {
return err
}
The pool creates the minimum workers immediately and grows on demand up to the
maximum. Its task queue has a fixed capacity of maxWorkers/2; once all workers
and queue slots are occupied, Submit waits for room. Close stops new
submissions and waits for accepted tasks to finish. A successful Submit means
the task was accepted; it does not mean the task has started or finished. With
maxWorkers == 1, the queue has zero capacity and submissions wait for a worker.
After a task finishes, a worker exits immediately only when total > min and
the number of other idle workers is greater than min/2. There is no idle
timeout. A task panic is logged and that worker continues with later tasks.
Tasks should return normally or panic. runtime.Goexit terminates its worker
without replacement. If the last worker exits this way, queued accepted tasks
are discarded so Close can return; if other workers remain, they keep the
queue. Call Close from outside pool tasks so it does not wait for itself.
A task may submit another task to the same pool. If all workers block submitting to a full queue, the caller must resolve that deadlock in its task logic.