Fiber::ExecutionContext::Isolated - Crystal 1.20.3

# class Fiber::ExecutionContext::Isolated

- Fiber::ExecutionContext::Isolated
- Reference
- Object

##
Overview

Isolated execution context to run a single fiber.

Concurrency and parallelism are disabled. The context guarantees that the fiber will always run on the same system thread until it terminates; the fiber owns the system thread for its whole lifetime.

Keep in mind that the fiber will still run in parallel to other fibers running in other execution contexts at the same time.

Concurrency is disabled, so an isolated fiber can't spawn fibers into the context, but it can spawn fibers into other execution contexts. Since it can be inconvenient to pass an execution context around, calls to `::spawn` will spawn a fiber into the specified spawn_context during initialization, which defaults to `Fiber::ExecutionContext.default`.

Isolated fibers can normally communicate with other fibers running in other execution contexts using `Channel`, `WaitGroup` or `Sync` for example. They can also execute `IO` operations or `sleep` just like any other fiber.

Calls that result in waiting (e.g. sleep, or socket read/write) will block the thread since there are no other fibers to switch to. This in turn allows to call anything that would block the thread without blocking any other fiber.

For example you can start an isolated fiber to run a blocking GUI loop, transparently forward `::spawn` to the default context, then keep the main fiber to wait until the GUI application quit:

    gtk = Fiber::ExecutionContext::Isolated.new("Gtk") do
      Gtk.main
    end
    gtk.wait

##
Included Modules

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

##
Defined in:

fiber/execution_context/isolated.cr

##
Constructors

- .new(name : String, spawn_context : ExecutionContext = ExecutionContext.default, &func : -> )

  Starts a new thread named name to execute func.

##
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
- #running? : Bool
- #spawn(*, name : String | Nil = nil, &block : -> ) : Fiber

  Instantiates a fiber and enqueues it into the scheduler's local queue.

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

- #wait : Nil

  Blocks the calling fiber until the isolated context fiber terminates.

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

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

current? : Scheduler | Nil 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

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

current? : ExecutionContext | Nil current?, default : ExecutionContext::Parallel default, default_workers_count : Int32 default_workers_count, each(&) : Nil each, thread_keepalive : Time::Span thread_keepalive, thread_keepalive=(thread_keepalive : Time::Span) thread_keepalive=

### 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 : String | IO, root : String)
from_json(string_or_io : String | 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, spawn_context : ExecutionContext = ExecutionContext.default, &func : -> ) #

Starts a new thread named name to execute func. Once func returns the thread will terminate.

##
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 running? : Bool #
def spawn(*, name : String | Nil = nil, &block : -> ) : Fiber #
Description copied from module Fiber::ExecutionContext::Scheduler

Instantiates a fiber and enqueues it into the scheduler's local queue.

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>

def wait : Nil #

Blocks the calling fiber until the isolated context fiber terminates. Returns immediately if the isolated fiber has already terminated. Re-raises unhandled exceptions raised by the fiber.

For example:

    ctx = Fiber::ExecutionContext::Isolated.new("test") do
      raise "fail"
    end
    ctx.wait # => re-raises "fail"