class Fiber::ExecutionContext::Isolated

Overview

Isolated execution context. Runs a single thread with a single fiber.

Concurrency is disabled within the thread: the fiber owns the thread and the thread can only run this fiber. Keep in mind that the fiber will still run in parallel to other fibers running in other execution contexts.

The fiber can still 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 that defaults to the default execution context.

Isolated fibers can normally communicate with other fibers running in other execution contexts using Channel(T), WaitGroup or Mutex 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.

You can for example use an isolated fiber to run a blocking GUI loop, transparently forward ::spawn to the default context, and eventually only block the current fiber while waiting for the GUI application to quit:

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

Included Modules

Defined in:

fiber/execution_context/isolated.cr

Constructors

Instance Method Summary

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

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, spawn_context : ExecutionContext = ExecutionContext.default, &func : -> ) #

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


[View source]

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>

[View source]
def name : String #

[View source]
def running? : Bool #

[View source]
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.


[View source]
def status : String #
Description copied from module Fiber::ExecutionContext::Scheduler

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


[View source]
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>

[View source]
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"

[View source]