W3cubDocs

/Crystal

class Channel(T)

Overview

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.

Defined in:

channel.cr

Constructors

Class Method Summary

Instance Method Summary

Constructor Detail

def self.new(capacity = 0)Source

Class Method Detail

def self.non_blocking_select(ops : Indexable(SelectAction))Source

def self.non_blocking_select(*ops : SelectAction)Source

def self.receive_first(channels : Tuple | Array)Source

def self.receive_first(*channels)Source

def self.select(ops : Indexable(SelectAction), has_else)Source

DEPRECATED Use Channel.non_blocking_select

def self.select(ops : Indexable(SelectAction))Source

def self.select(*ops : SelectAction)Source

def self.select_impl(ops : Indexable(SelectAction), non_blocking)Source

def self.send_first(value, channels : Tuple | Array)Source

def self.send_first(value, *channels)Source

Instance Method Detail

def close : NilSource

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.

def closed?Source

def inspect(io : IO) : NilSource

Description copied from class Reference

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>

def pretty_print(pp)Source

def receiveSource

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

def receive?Source

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.

def receive_impl(&)Source

def receive_internalSource

def send(value : T)Source

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.

© 2012–2020 Manas Technology Solutions.
Licensed under the Apache License, Version 2.0.
https://crystal-lang.org/api/0.35.1/Channel.html