Hi Tom,

This is an interesting project.

Per your request for feedback: on quick inspection, I would certainly want 
also a way to close down the priority channels too. 

Some sort of Close() method that would stop all running goroutines from 
behind-the-scenes, so they do not leak, would be important for any long 
running process.

Maybe even use of a context.Context to effect the shutdown?

You'll quickly realize that every go channel "raw" operation (not in a 
select) needs to be wrapped in a select{} in order to not be deadlocked 
when the time to shutdown arrives (usually on a channel itself). So for 
instance,

https://github.com/twpayne/go-heap/blob/v0.0.2/prioritychannel.go#L89 which 
says

for value := range heap.All() {
outCh <- value
}

would never do. One would need to allow for shutdown, something like:

for value := range heap.All() {
                                               select {
case outCh <- value:
                                                case <- shutdownRequestedCh:
                                                       return // and 
presumably run other cleanup in a defer at the top of this func
                                                }
}

...and repeat such fixes for all other "raw" channel sends and receives.

Regards,
Jason




On Sunday, October 6, 2024 at 1:42:14 AM UTC+1 twp...@gmail.com wrote:

> Have you ever wanted a channel that partially sorts the values being 
> passed through it? For example, you have some kind of work queue and you 
> want to do the most important work first. Well, now you can!
>
> github.com/twpayne/go-heap.PriorityChannel 
> <https://pkg.go.dev/github.com/twpayne/go-heap#PriorityChannel> 
> implements this: give it a channel and a comparison function and you get 
> back a new channel that returns values in priority order until the original 
> channel is closed.
>
> Only want the highest priority value from the last N? Then use 
> github.com/twpayne/go-heap.BufferedPriorityChannel 
> <https://pkg.go.dev/github.com/twpayne/go-heap#BufferedPriorityChannel>.
>
> Code is at https://github.com/twpayne/go-heap/blob/main/prioritychannel.go. 
> It's a fun combination of generics, iterators, and channels.
>
> Feedback welcome!
>
> Regards,
> Tom
>

-- 
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 on the web visit 
https://groups.google.com/d/msgid/golang-nuts/a95ef59c-86b5-4524-bef5-1dacbe84de5en%40googlegroups.com.

Reply via email to