class Condition
A synchronization primitive, which allows fibers to wait until a particular condition is (edge) triggered. Zero or more fibers can wait on a condition. When the condition is signalled, the fibers will be resumed in order.
Example
require 'async'
Sync do
condition = Async::Condition.new
Async do
Console.info "Waiting for condition..."
value = condition.wait
Console.info "Condition was signalled: #{value}"
end
Async do |task|
task.sleep(1)
Console.info "Signalling condition..."
condition.signal("Hello World")
end
end
Output
0.0s info: Waiting for condition...
1.0s info: Signalling condition...
1.0s info: Condition was signalled: Hello World
Signature
- public
Since
stable-v1
.
Nested
Definitions
def initialize
Create a new condition.
Implementation
def initialize
@waiting = List.new
end
def wait
Queue up the current fiber and wait on yielding the task.
Signature
-
returns
Object
Implementation
def wait
@waiting.stack(FiberNode.new(Fiber.current)) do
Fiber.scheduler.transfer
end
end
def empty?
- deprecated
Signature
- deprecated
Replaced by
#waiting?
Implementation
def empty?
@waiting.empty?
end
def waiting?
Signature
-
returns
Boolean
Is any fiber waiting on this notification?
Implementation
def waiting?
@waiting.size > 0
end
def signal(value = nil)
Signal to a given task that it should resume operations.
Signature
-
parameter
value
Object | Nil
The value to return to the waiting fibers.
Implementation
def signal(value = nil)
return if @waiting.empty?
waiting = self.exchange
waiting.each do |fiber|
Fiber.scheduler.resume(fiber, value) if fiber.alive?
end
return nil
end