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