The Queue constructor should take an initial set of items
I often create a
Queue and then process it with a set of concurrent workers in threads. I end up writing:
q = Queue.new worklist.each do |work| q.push work end
I'd rather be able to write
q = Queue.new(*worklist)
Updated by ioquatix (Samuel Williams) 2 months ago
What about a way to bulk add items, e.g.
q.concat or whatever is the same for Array, and maybe it would be best to have the first argument as an array, e.g.
Queue.new(worklist)? I think it's more expensive to expand it in CRuby when you write
Internally, this might still be adding one item at a time, in order to invoke the right "wakeup" machinery.
Updated by chrisseaton (Chris Seaton) 2 months ago
I'm not worried about
Queue.new(*worklist), so that's fine if more people feel that way. I think the key thing is conciseness in text source code, and also avoiding needing to synchronise while adding each individual item.
Updated by ufuk (Ufuk Kayserilioglu) 2 months ago
Agreed with byroot (Jean Boussier) (actually I was going to note the same, he beat me to it).
I would also like to note that different from
Set, for example, the order of items in the supplied parameter matters in the
Queue case. Even though the expected outcome is for the items to be
pushed to the
Queue in given order, it might still be a good idea to explicitly call that out in the method documentation.
Updated by chrisseaton (Chris Seaton) about 1 month ago
I updated to take a single array rather than a variable number of arguments.
I had two choices for how to do this -
Set takes an
each to access items, and
Array takes another
#to_ary if needed.
I went with the same as what
Array does, because both
Queue are core libraries, where
Set is a standard library.