class

Channel(T)

Inherits Iterator / Enumerable / Reference / Object

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.

Instance methods

receive

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
Source
receive?

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.

Source
send(value : T) : self

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.

Source