class Channel(T)
inherits Reference
¶
A Channel
enables concurrent communication between fibers.
They allow communicating data between fibers without sharing memory and without having to worry about locks, semaphores or other special structures.
channel = Channel(Int32).new
spawn do
channel.send(0)
channel.send(1)
end
channel.receive # => 0
channel.receive # => 1
Note
Although a Channel(Nil)
or any other nilable types like Channel(Int32?)
are valid
they are discouraged since from certain methods or constructs it receiving a nil
as data
will be indistinguishable from a closed channel.
Class methods¶
Methods¶
#close : Bool
¶
: Bool
Closes the channel.
The method prevents any new value from being sent to / received from the channel.
All fibers blocked in send
or receive
will be awakened with Channel::ClosedError
Both awaiting and subsequent calls to #send
will consider the channel closed.
All items successfully sent to the channel can be received, before #receive
considers the channel closed.
Calling #close
on a closed channel does not have any effect.
It returns true
when the channel was successfully closed, or false
if it was already closed.
#inspect(io : IO) : Nil
¶
(io : IO) : Nil
Appends a String representation of this object which includes its class name, its object address and the values of all instance variables.
class Person
def initialize(@name : String, @age : Int32)
end
end
Person.new("John", 32).inspect # => #<Person:0x10fd31f20 @name="John", @age=32>
#receive : T
¶
: T
Receives a value from the channel. If there is a value waiting, then it is returned immediately. Otherwise, this method blocks until a value is sent to the channel.
Raises ClosedError
if the channel is closed or closes while waiting for receive.
channel = Channel(Int32).new
spawn do
channel.send(1)
end
channel.receive # => 1
#receive? : T?
¶
: T?
Receives a value from the channel. If there is a value waiting, it is returned immediately. Otherwise, this method blocks until a value is sent to the channel.
Returns nil
if the channel is closed or closes while waiting for receive.
#send(value : T)
¶
(value : T)
Sends a value to the channel.
If the channel has spare capacity, then the method returns immediately.
Otherwise, this method blocks the calling fiber until another fiber calls #receive
on the channel.
Raises ClosedError
if the channel is closed or closes while waiting on a full channel.