1.5 KiB
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. A panic in worker scheduling code is
logged and terminates that worker without replacement. runtime.Goexit from a
task has the same worker-exit behavior. If the last worker exits abnormally,
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.