# class Fiber::ExecutionContext::Concurrent

- Fiber::ExecutionContext::Concurrent
- Reference
- Object

##
Overview

Concurrent-only execution context.

Fibers running in the same context can only run concurrently and never in parallel to each others. However, they still run in parallel to fibers running in other execution contexts.

Fibers in this context can use simpler and faster synchronization primitives between themselves (for example no atomics or thread safety required), but data shared with other contexts needs to be protected (e.g. `Mutex`), and communication with fibers in other contexts requires safe primitives, for example `Channel`.

A blocking fiber blocks the entire context, and thus all the other fibers in the context.

For example: we can start a concurrent context to run consumer fibers, while the default context produces values. Because the consumer fibers will never run in parallel and don't yield between reading result then writing it, we are not required to synchronize accesses to the value:

    require "wait_group"

    consumers = Fiber::ExecutionContext::Concurrent.new("consumers")
    channel = Channel(Int32).new(64)
    wg = WaitGroup.new(32)

    result = 0

    32.times do
      consumers.spawn do
        while value = channel.receive?
          # safe, but only for this example:
          result = result + value
        end
      ensure
        wg.done
      end
    end

    1024.times { |i| channel.send(i) }
    channel.close

    # wait for all workers to be done
    wg.wait

    p result # => 523776

In practice, we still recommended to always protect shared accesses to a variable, for example using `Atomic#add` to increment result or a `Mutex` for more complex operations.

##
Included Modules

- Fiber::ExecutionContext
- Fiber::ExecutionContext::Scheduler

##
Defined in:

fiber/execution_context/concurrent.cr

##
Constructors

- .new(name : String) : self

##
Instance Method Summary

- #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.

- #name : String
- #status : String

  Returns the current status of the scheduler.

- #to_s(io : IO) : Nil

  Appends a short String representation of this object which includes its class name and its object address.

### Instance methods inherited from module `Fiber::ExecutionContext::Scheduler`

spawn(*, name : String | Nil = nil, &block : -> ) : Fiber
spawn(*, name : String | Nil = nil, same_thread : Bool, &) : Fiber spawn, status : String status

### Constructor methods inherited from module `Fiber::ExecutionContext::Scheduler`

current : Scheduler current

### Instance methods inherited from module `Fiber::ExecutionContext`

spawn(*, name : String | Nil = nil, &block : -> ) : Fiber spawn

### Constructor methods inherited from module `Fiber::ExecutionContext`

current : ExecutionContext current, default : ExecutionContext default

### Class methods inherited from module `Fiber::ExecutionContext`

current? : ExecutionContext | Nil current?, default_workers_count : Int32 default_workers_count, each(&) : Nil each

### Instance methods inherited from class `Reference`

==(other : self)
==(other : JSON::Any)
==(other : YAML::Any)
==(other) ==, dup dup, hash(hasher) hash, initialize initialize, inspect(io : IO) : Nil inspect, object_id : UInt64 object_id, pretty_print(pp) : Nil pretty_print, same?(other : Reference) : Bool
same?(other : Nil) same?, to_s(io : IO) : Nil to_s

### Constructor methods inherited from class `Reference`

new new, unsafe_construct(address : Pointer, *args, **opts) : self unsafe_construct

### Class methods inherited from class `Reference`

pre_initialize(address : Pointer) pre_initialize

### Instance methods inherited from class `Object`

! : Bool !, !=(other) !=, !~(other) !~, ==(other) ==, ===(other : JSON::Any)
===(other : YAML::Any)
===(other) ===, =~(other) =~, as(type : Class) as, as?(type : Class) as?, class class, dup dup, hash(hasher)
hash hash, in?(collection : Object) : Bool
in?(*values : Object) : Bool in?, inspect(io : IO) : Nil
inspect : String inspect, is_a?(type : Class) : Bool is_a?, itself itself, nil? : Bool nil?, not_nil!(message)
not_nil! not_nil!, pretty_inspect(width = 79, newline = "\n", indent = 0) : String pretty_inspect, pretty_print(pp : PrettyPrint) : Nil pretty_print, responds_to?(name : Symbol) : Bool responds_to?, tap(&) tap, to_json(io : IO) : Nil
to_json : String to_json, to_pretty_json(indent : String = " ") : String
to_pretty_json(io : IO, indent : String = " ") : Nil to_pretty_json, to_s(io : IO) : Nil
to_s : String to_s, to_yaml(io : IO) : Nil
to_yaml : String to_yaml, try(&) try, unsafe_as(type : T.class) forall T unsafe_as

### Class methods inherited from class `Object`

from_json(string_or_io, root : String)
from_json(string_or_io) from_json, from_yaml(string_or_io : String | IO) from_yaml

### Macros inherited from class `Object`

class_getter(*names, &block) class_getter, class_getter!(*names) class_getter!, class_getter?(*names, &block) class_getter?, class_property(*names, &block) class_property, class_property!(*names) class_property!, class_property?(*names, &block) class_property?, class_setter(*names) class_setter, def_clone def_clone, def_equals(*fields) def_equals, def_equals_and_hash(*fields) def_equals_and_hash, def_hash(*fields) def_hash, delegate(*methods, to object) delegate, forward_missing_to(delegate) forward_missing_to, getter(*names, &block) getter, getter!(*names) getter!, getter?(*names, &block) getter?, property(*names, &block) property, property!(*names) property!, property?(*names, &block) property?, setter(*names) setter

##
Constructor Detail

def self.new(name : String) : self #

##
Instance Method Detail

def inspect(io : IO) : Nil #
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 name : String #
def status : String #
Description copied from module Fiber::ExecutionContext::Scheduler

Returns the current status of the scheduler. For example `"running"`, `"event-loop"` or `"parked"`.

def to_s(io : IO) : Nil #
Description copied from class Reference

Appends a short String representation of this object which includes its class name and its object address.

    class Person
      def initialize(@name : String, @age : Int32)
      end
    end

    Person.new("John", 32).to_s # => #<Person:0x10a199f20>