Goroutines need explicit exit paths even with garbage collection
A producer can remain blocked forever after its consumer stops receiving values from a channel.
Go's pipeline guide states that goroutines are not garbage collected and must exit on their own.
I would define cancellation and termination behavior when creating a worker, rather than adding cleanup after failures appear.
Every blocking operation needs a considered escape path when downstream work no longer needs its result.
If concurrency needs restraint, then integration tests should exercise early termination as well as successful processing.
The guide shows cancellation signals allowing upstream stages to abandon sends when consumers finish early.
Treat worker lifetime as an explicit responsibility, because automatic memory management does not terminate abandoned work.