Module: Kernel
- Defined in:
- lib/kernel/sync.rb,
lib/kernel/async.rb
Overview
Extensions to all Ruby objects.
Instance Method Summary collapse
-
#Async ⇒ Object
Run the given block of code in a task, asynchronously, creating a reactor if necessary.
-
#Sync(&block) ⇒ Object
Run the given block of code synchronously, but within a reactor if not already in one.
Instance Method Details
#Async ⇒ Object
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.
24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
# File 'lib/kernel/async.rb', line 24 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 |
#Sync(&block) ⇒ Object
Run the given block of code synchronously, but within a reactor if not already in one.
18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
# File 'lib/kernel/sync.rb', line 18 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 |