AsyncSourceKernel

module Kernel

Extensions to all Ruby objects.

Definitions

def Async(...)

  • public
  • asynchronous

Run the given block of code in a task, asynchronously, creating a reactor if necessary.

The preferred method to invoke asynchronous behavior at the top level.

  • When invoked within an existing reactor task, it will run the given block asynchronously. Will return the task once it has been scheduled.
  • When invoked at the top level, will create and run a reactor, and invoke the block as an asynchronous task. Will block until the reactor finishes running.

Signature

yields {|task| ...}

The block that will execute asynchronously.

parameter task Async::Task

The task that is executing the given block.

public

Since Async v1.

asynchronous

May block until given block completes executing.

Implementation

def Async(...)	if current = ::Async::Task.current?	return current.async(...)	elsif scheduler = Fiber.scheduler	::Async::Task.run(scheduler, ...)	else	# This calls Fiber.set_scheduler(self):	reactor = ::Async::Reactor.new	begin	return reactor.run(...)	ensure	Fiber.set_scheduler(nil)	end	end end

def Sync(annotation: nil, &block)

  • public
  • asynchronous

Run the given block of code synchronously, but within a reactor if not already in one.

Signature

yields {|task| ...}

The block that will execute asynchronously.

parameter task Async::Task

The task that is executing the given block.

public

Since Async v1.

asynchronous

Will block until given block completes executing.

Implementation

def Sync(annotation: nil, &block)	if task = ::Async::Task.current?	if annotation	task.annotate(annotation) {yield task}	else	yield task	end	elsif scheduler = Fiber.scheduler	::Async::Task.run(scheduler, &block).wait	else	# This calls Fiber.set_scheduler(self):	reactor = Async::Reactor.new	begin	return reactor.run(annotation: annotation, finished: ::Async::Condition.new, &block).wait	ensure	Fiber.set_scheduler(nil)	end	end end

Discussion