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