Class: Concurrent::Throttle
- Inherits:
-
Synchronization::Object
- Object
- Synchronization::Object
- Concurrent::Throttle
- Includes:
- PromisesIntegration
- Defined in:
- lib/concurrent/edge/throttle.rb
Overview
A tool manage concurrency level of future tasks.
Defined Under Namespace
Modules: PromisesIntegration
Instance Method Summary collapse
-
#initialize(limit) ⇒ Throttle
constructor
New throttle.
-
#limit ⇒ Integer
The limit.
-
#release ⇒ self
Has to be called once for each trigger after it is ok to execute another throttled task.
-
#throttled_block { ... } ⇒ Object
Blocks current thread until the block can be executed.
-
#to_s ⇒ String
(also: #inspect)
Short string representation.
-
#trigger ⇒ Promises::Event
New event which will be resolved when depending tasks can execute.
Methods included from PromisesIntegration
#throttled_future, #throttled_future_chain
Constructor Details
#initialize(limit) ⇒ Throttle
New throttle.
59 60 61 62 63 64 |
# File 'lib/concurrent/edge/throttle.rb', line 59 def initialize(limit) super() @Limit = limit self.can_run = limit @Queue = LockFreeQueue.new end |
Instance Method Details
#limit ⇒ Integer
Returns The limit.
67 68 69 |
# File 'lib/concurrent/edge/throttle.rb', line 67 def limit @Limit end |
#release ⇒ self
Has to be called once for each trigger after it is ok to execute another throttled task.
93 94 95 96 97 98 99 100 101 102 103 104 |
# File 'lib/concurrent/edge/throttle.rb', line 93 def release while true current_can_run = can_run if compare_and_set_can_run current_can_run, current_can_run + 1 if current_can_run < 0 Thread.pass until (trigger = @Queue.pop) trigger.resolve end return self end end end |
#throttled_block { ... } ⇒ Object
Blocks current thread until the block can be executed.
111 112 113 114 115 116 |
# File 'lib/concurrent/edge/throttle.rb', line 111 def throttled_block(&block) trigger.wait block.call ensure release end |
#to_s ⇒ String Also known as: inspect
Returns Short string representation.
119 120 121 |
# File 'lib/concurrent/edge/throttle.rb', line 119 def to_s format '<#%s:0x%x limit:%s can_run:%d>', self.class, object_id << 1, @Limit, can_run end |
#trigger ⇒ Promises::Event
New event which will be resolved when depending tasks can execute. Has to be used and after the critical work is done #release must be called exactly once.
75 76 77 78 79 80 81 82 83 84 85 86 87 88 |
# File 'lib/concurrent/edge/throttle.rb', line 75 def trigger while true current_can_run = can_run if compare_and_set_can_run current_can_run, current_can_run - 1 if current_can_run > 0 return Promises.resolved_event else event = Promises.resolvable_event @Queue.push event return event end end end end |