Class: Concurrent::WrappingExecutor

Inherits:
Synchronization::Object
  • Object
show all
Defined in:
lib/concurrent-ruby-edge/concurrent/executor/wrapping_executor.rb

Overview

A delegating executor which modifies each task with arguments before the task is given to the target executor it delegates to.

Examples:

Count task executions

counter = AtomicFixnum.new count_executions = WrappingExecutor.new Concurrent.global_io_executor do |*args, &task| [*args, -> *args { counter.increment; task.call *args }] end 10.times { count_executions.post { :do_something } } sleep 0.01 counter.value #=> 10

Instance Method Summary collapse

Constructor Details

#initialize(executor) {|*args, &task| ... } ⇒ WrappingExecutor

Returns a new instance of WrappingExecutor.

Parameters:

  • executor (Executor)

    an executor to delegate the tasks to

Yields:

  • (*args, &task)

    A function which can modify the task with arguments

Yield Parameters:

  • *args (Array<Object>)

    the arguments submitted with the tasks

  • &task (block)

    the task submitted to the executor to be modified

Yield Returns:

  • (Array<Object>)

    a new arguments and task [*args, task] which are submitted to the target executor

 26 27 28 29 30
# File 'lib/concurrent-ruby-edge/concurrent/executor/wrapping_executor.rb', line 26 def initialize(executor, &wrapper) super() @Wrapper = wrapper @Executor = executor end

Instance Method Details

#can_overflow?Boolean

Does the task queue have a maximum size?

Returns:

  • (Boolean)

    True if the task queue has a maximum size else false.

 41 42 43
# File 'lib/concurrent-ruby-edge/concurrent/executor/wrapping_executor.rb', line 41 def can_overflow? @Executor.can_overflow? end

#post(*args) { ... } ⇒ Boolean

Submit a task to the executor for asynchronous processing.

Parameters:

  • args (Array)

    zero or more arguments to be passed to the task

Yields:

  • the asynchronous task to perform

Returns:

  • (Boolean)

    true if the task is queued, false if the executor is not running

Raises:

  • (ArgumentError)

    if no task is given

See Also:

 35 36 37 38
# File 'lib/concurrent-ruby-edge/concurrent/executor/wrapping_executor.rb', line 35 def post(*args, &task) *args, task = @Wrapper.call(*args, &task) @Executor.post(*args, &task) end

#serialized?Boolean

Does this executor guarantee serialization of its operations?

Returns:

  • (Boolean)

    True if the executor guarantees that all operations will be post in the order they are received and no two operations may occur simultaneously. Else false.

 46 47 48
# File 'lib/concurrent-ruby-edge/concurrent/executor/wrapping_executor.rb', line 46 def serialized? @Executor.serialized? end