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.

Constructors

new(capacity : Int32 = 0)
Source

Class methods

receive_first(channels : Enumerable(Channel))
Source
receive_first(*channels)
Source
send_first(value, channels : Enumerable(Channel)) : Nil
Source
send_first(value, *channels) : Nil
Source

Instance methods

close

Closes the channel. The method prevents any new value from being sent to the channel.

If the channel has buffered values, then subsequent calls to receive will succeed and consume the buffer until it is empty.

All fibers blocked in send or receive will be awakened with Channel::ClosedError. All subsequent calls to #send will consider the channel closed. Subsequent calls to #receive will consider the channel closed if the buffer is empty.

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.

Source
closed?
Source
inspect(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>
Source
next

Returns the next element in this iterator, or Iterator::Stop::INSTANCE if there are no more elements.

Source
pretty_print(pp)
Source
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

Nested types