Feature #17327

The Queue constructor should take an initial set of items

Added by chrisseaton (Chris Seaton) 2 months ago. Updated 3 days ago.

Target version:


I often create a Queue and then process it with a set of concurrent workers in threads. I end up writing:

q =
worklist.each do |work|
  q.push work

I'd rather be able to write

q =*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. I think it's more expensive to expand it in CRuby when you write *worklist.

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 or*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 ioquatix (Samuel Williams) 2 months ago

That all makes sense to me.

Updated by byroot (Jean Boussier) 2 months ago

I agree that the constructor should take an enumerable rather than variadic arguments, as it would be consistent with[1, 2, 3]), and[1, 2, 3])

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 Enumerable, using each to access items, and Array takes another Array, using #to_ary if needed.

I went with the same as what Array does, because both Array and Queue are core libraries, where Set is a standard library.

Updated by matz (Yukihiro Matsumoto) 3 days ago

I accept the idea. Take Enumerable as initial values.


Also available in: Atom PDF