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 |