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)
-
- (Throttle) initialize(limit)
constructor
New throttle.
-
- (Integer) limit
The limit.
-
- (self) release
Has to be called once for each trigger after it is ok to execute another throttled task.
-
- (Object) throttled_block { ... }
Blocks current thread until the block can be executed.
-
- (Promises::Future) throttled_future(*args, &task)
included
from PromisesIntegration
Behaves as Promises::FactoryMethods#future but the future is throttled.
-
- (Promises::Event, Promises::Future) throttled_future_chain {|trigger| ... }
included
from PromisesIntegration
Allows to throttle a chain of promises.
-
- (String) to_s
(also: #inspect)
Short string representation.
-
- (Promises::Event) trigger
New event which will be resolved when depending tasks can execute.
Constructor Details
- (Throttle) initialize(limit)
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
- (Integer) limit
Returns The limit.
67 68 69 |
# File 'lib/concurrent/edge/throttle.rb', line 67 def limit @Limit end |
- (self) release
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 |
- (Object) throttled_block { ... }
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 |
- (Promises::Future) throttled_future(*args, &task) Originally defined in module PromisesIntegration
Behaves as Promises::FactoryMethods#future but the future is throttled.
- (Promises::Event, Promises::Future) throttled_future_chain {|trigger| ... } Originally defined in module PromisesIntegration
Allows to throttle a chain of promises.
- (String) to_s 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 |
- (Promises::Event) trigger
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 |