Async SourceKernel

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 stable-v1.

asynchronous

May block until given block completes executing.

Implementation

def Async(...)
	if current = ::Async::Task.current?
		return current.async(...)
	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(&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 stable-v1.

asynchronous

Will block until given block completes executing.

Implementation

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

Discussion