Class: Concurrent::SerializedExecution
- Inherits:
-
Object
- Object
- Concurrent::SerializedExecution
- Includes:
- Logging, Synchronization
- Defined in:
- lib/concurrent/executor/serialized_execution.rb
Overview
Ensures passed jobs in a serialized order never running at the same time.
Defined Under Namespace
Classes: Job
Instance Method Summary collapse
-
#initialize ⇒ SerializedExecution
constructor
A new instance of SerializedExecution.
-
#post(executor, *args) { ... } ⇒ Boolean
Submit a task to the executor for asynchronous processing.
-
#posts(posts) ⇒ Object
As #post but allows to submit multiple tasks at once, it’s guaranteed that they will not be interleaved by other tasks.
Methods included from Logging
Constructor Details
#initialize ⇒ SerializedExecution
19 20 21 22 23 24 |
# File 'lib/concurrent/executor/serialized_execution.rb', line 19 def initialize synchronize do @being_executed = false @stash = [] end end |
Instance Method Details
#post(executor, *args) { ... } ⇒ Boolean
Submit a task to the executor for asynchronous processing.
38 39 40 41 |
# File 'lib/concurrent/executor/serialized_execution.rb', line 38 def post(executor, *args, &task) posts [[executor, args, task]] true end |
#posts(posts) ⇒ Object
As #post but allows to submit multiple tasks at once, it’s guaranteed that they will not be interleaved by other tasks.
48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 |
# File 'lib/concurrent/executor/serialized_execution.rb', line 48 def posts(posts) # if can_overflow? # raise ArgumentError, 'SerializedExecution does not support thread-pools which can overflow' # end return nil if posts.empty? jobs = posts.map { |executor, args, task| Job.new executor, args, task } job_to_post = synchronize do if @being_executed @stash.push(*jobs) nil else @being_executed = true @stash.push(*jobs[1..-1]) jobs.first end end call_job job_to_post if job_to_post true end |