Isolate worker panics and preserve queued tasks for surviving workers

This commit is contained in:
2026-10-20 21:47:55 +08:00
parent 5bf542fc67
commit 44cadc6d26
3 changed files with 286 additions and 37 deletions

View File

@@ -26,10 +26,12 @@ 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.
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.