This sounds incorrect to me. I think the better approach might be to 
signal/cancel the jobs, and as the jobs cancel themselves, they will decrement 
the waitGroup - releasing the waiter eventually. A shared context across the 
jobs in a pool seems natural.

> On Feb 15, 2025, at 4:18 PM, Jason E. Aten <j.e.a...@gmail.com> wrote:
> 
> Thanks Boris.  
> 
> I promised Boris I would explain the problem that the idem library solves 
> with traditional
> sync.WaitGroup usage, as found in his referenced library, if he posted his 
> suggestion 
> back here on the list instead of in a dm, so here goes:
> 
> Imagine you have a backup server that you are sending lots of files to.
> Further imagine that you have alot of goroutines in running
> in parallel to handle the uploads.
> 
> Now lets suppose that we want to handle an out-of-disk-space condition 
> gracefully.
> Really this could be any error where we want to shut down a worker pool
> of goroutines early, and we've been using a sync.WaitGroup for to manage them.
> 
> So our goal is: we've run out of disk, and now we want to stop all the 
> in-progress
> goroutines from spewings errors all over our logs, but without panic-ing. 
> Suppose we want our server to stay up and responsive and answering questions 
> about its health, and telling us about its disk space problem; but maybe still
> serving reads, just not writes. Anyway... you get the point, the goal is: 
> don't panic, 
> and shut down a pool of goroutines gracefully.
> 
> We can always panic and catch the panics, but that could also hide
> some very different errors, or logic errors in the code itself, and so we 
> want to, as
> a general goal, avoid using panic as a catch all.
> 
> If we are using a sync.WaitGroup, and have say 40 upload jobs in progress 
> when we
> run out disk space, then we need to cancel all the jobs in progress before
> they have finished.  
> 
> But, because we have used a traditional sync.WaitGroup,
> we are hosed. We cannot cancel the Wait once it has started. There is 
> no mechanism designed in to do that.
> 
> Now you say, well, we could artificially decrement the wait count down to 
> zero to release
> the Wait call, right? Well, that runs into the panic problem, because now you
> have a race with any goroutine that is finishing right as you want to force
> the wait to end by artificially decrementing the wait group count. That race
> means that you are just as likely to spuriously panic when trying to abort the
> wait as not.  So that is a non-starter, given the rules of the game outlined 
> above:
> no spurious panics--as they hide real problems and/or bad logic. 
> 
> So this is the problem that a idem.IdemCloseChan solves with the methods
> TaskAdd, TaskDone, and TaskWait.  See 
> https://github.com/glycerine/idem/blob/master/halter.go#L427
> 
> Specially, TaskWait takes a giveup channel (that could come from a context), 
> and you can also just close the IdemCloseChan to stop waiting. 
> 
> This gives you a clean early exit from waiting on a count of tasks--and no 
> spurious panics to suppress.
> 
> On Saturday, February 15, 2025 at 2:20:44 PM UTC Nagaev Boris wrote:
>> On Thu, Feb 13, 2025 at 6:11 PM Jason E. Aten <j.e....@gmail.com <>> wrote: 
>> 
>> > 3) I almost always need to know when my goroutines are done, 
>> > 
>> > and to shut them all down in case of an error from one. 
>> > 
>> > 
>> > My idem package provides goroutine supervision trees 
>> > 
>> > and also shows how to integrate sync.WaitGroup-style 
>> > 
>> > task counting effectively with Go channels. Normal 
>> > 
>> > sync.WaitGroup is a hazard in production code because 
>> > 
>> > you cannot abort a Wait in case of error or shutdown. 
>> > 
>> > 
>> > https://github.com/glycerine/idem 
>> 
>> 
>> Hey Jason! 
>> 
>> Maybe this one can be interesting for you: 
>> https://pkg.go.dev/github.com/lightningnetwork/lnd/fn/v2#GoroutineManager 
>> It is based on a mutex and a WaitGroup and utilizes context.Context. 
>> 
>> 
>> -- 
>> Best regards, 
>> Boris Nagaev 
> 
> 
> -- 
> You received this message because you are subscribed to the Google Groups 
> "golang-nuts" group.
> To unsubscribe from this group and stop receiving emails from it, send an 
> email to golang-nuts+unsubscr...@googlegroups.com 
> <mailto:golang-nuts+unsubscr...@googlegroups.com>.
> To view this discussion visit 
> https://groups.google.com/d/msgid/golang-nuts/4623e193-bef6-46f4-bbdb-c4af00241c70n%40googlegroups.com
>  
> <https://groups.google.com/d/msgid/golang-nuts/4623e193-bef6-46f4-bbdb-c4af00241c70n%40googlegroups.com?utm_medium=email&utm_source=footer>.

-- 
You received this message because you are subscribed to the Google Groups 
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to golang-nuts+unsubscr...@googlegroups.com.
To view this discussion visit 
https://groups.google.com/d/msgid/golang-nuts/10C15873-9F30-4BA3-8EAC-0098528B8DB4%40ix.netcom.com.

Reply via email to