On 12/12/2011 01:23 PM, Robert Klemme wrote:
>
> I would change the API slightly to modify behavior of #push:
>
> 1. push(obj, method, *arguments)
This was my first interface idea, too. But I skipped it to be able to push a whole list of items at once. But 
it really lacks readability - that's for sure. I guess I will let the user do the iteration over the items to 
push in favour of having a beautiful interface. I could keep the old push interface under a different name.
> 2. push(&block)
A very good point! I've neglected blocks totally (shame on me).
>
> Example
>
> 1. send method
>
> jq.push($stdout, :puts, "hello world")
>
> 2. use block
>
> jq.push do
>    puts "hello world"
> end
Will add these to my unit tests.
>
> One could even extend behavior by providing a back channel for results:
>
> jq.push do |back_channel|
>    back_channel<<  (1 + complicated_calculation() * 123)
> end
>
> For that of course you must define how reply values are dealt with
> (there could be a null back channel which just discards results if
> configured that way).  Alternatively however just the result values of
> method and block invocation could be used.  Maybe that's cleaner.
Hm. It's definitely good for testing. Could you image a "real" use case for this?  Maybe parallel image 
processing or database requests.
>
>
> Also I would separate support for the call of system: Basically
> invoking system is a special case which does not necessarily have
> something to do with job queues in general.  So a better solution
> would be to have a specialized job queue, e.g.
>
> class SystemJobs
>    attr_reader :jq
>
>    def initialize(jq)
>      @jq = jq
>    end
>
>    def push(*args)
>      jq.push do |back_channel|
>        back_channel<<  system(*args)
>        # we could use a variant of IO.popen here as well which
>        # captures output
>      end
>    end
> end
>
> You then could still do the pretty short
>
> sj.jq.push($stdout, :puts, "hello world")
This would simplify the task handling in the JobQueue class. Running system commands and calling ruby methods 
in the same queue should not be the regular case.

Many thanks!
ralf