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(annotation: nil, &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 38 39 |
# File 'lib/kernel/async.rb', line 24 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 |
#Sync(annotation: nil, &block) ⇒ Object
Run the given block of code synchronously, but within a reactor if not already in one.
19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
# File 'lib/kernel/sync.rb', line 19 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 |