Files
worker/README.md

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.

Only Close shuts down the pool. A task panic is logged and the same worker continues. A worker scheduling panic or runtime.Goexit terminates that worker; the pool starts a replacement as needed, and accepted queued tasks remain available even while Close is draining. The task that panicked or called runtime.Goexit is not retried. 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.