Class: Concurrent::SerializedExecution
- Inherits:
-
Concurrent::Synchronization::LockableObject
- Object
- Concurrent::Synchronization::LockableObject
- Concurrent::SerializedExecution
- 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.
Constructor Details
#initialize ⇒ SerializedExecution
Returns a new instance of SerializedExecution.
11 12 13 14 |
# File 'lib/concurrent/executor/serialized_execution.rb', line 11 def initialize() super() synchronize { ns_initialize } end |
Instance Method Details
#post(executor, *args) { ... } ⇒ Boolean
Submit a task to the executor for asynchronous processing.
34 35 36 37 |
# File 'lib/concurrent/executor/serialized_execution.rb', line 34 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.
44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 |
# File 'lib/concurrent/executor/serialized_execution.rb', line 44 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 |