Module: EventMachine::Synchrony

Defined in:
lib/em-synchrony.rb,
lib/em-synchrony/amqp.rb,
lib/em-synchrony/thread.rb,
lib/em-synchrony/em-multi.rb,
lib/em-synchrony/iterator.rb,
lib/em-synchrony/keyboard.rb,
lib/em-synchrony/tcpsocket.rb,
lib/em-synchrony/fiber_iterator.rb,
lib/em-synchrony/connection_pool.rb

Defined Under Namespace

Modules: AMQP, Thread Classes: ConnectionPool, FiberIterator, Iterator, Keyboard, KeyboardHandler, Multi, TCPSocket

Class Method Summary collapse

Class Method Details

.add_periodic_timer(interval, &blk) ⇒ Object

Fiber-aware EventMachine timer: wraps the passed in block within a new fiber (new fiber on every invocation) to allow you to continue using synchrony methods



90
91
92
93
94
# File 'lib/em-synchrony.rb', line 90

def self.add_periodic_timer(interval, &blk)
  EM.add_periodic_timer(interval) do
    Fiber.new { blk.call }.resume
  end
end

.add_timer(interval, &blk) ⇒ Object

Fiber-aware EventMachine timer: wraps the passed in block within a new fiber context such that you can continue using synchrony methods



80
81
82
83
84
# File 'lib/em-synchrony.rb', line 80

def self.add_timer(interval, &blk)
  EM.add_timer(interval) do
    Fiber.new { blk.call }.resume
  end
end

.getsObject

Routes to EM::Synchrony::Keyboard



104
105
106
# File 'lib/em-synchrony.rb', line 104

def self.gets
  EventMachine::Synchrony::Keyboard.new.gets
end

.next_tick(&blk) ⇒ Object

Fiber-aware EM.next_tick convenience function



98
99
100
# File 'lib/em-synchrony.rb', line 98

def self.next_tick(&blk)
  EM.next_tick { Fiber.new { blk.call }.resume }
end

.sleep(secs) ⇒ Object

Fiber-aware sleep function using an EM timer

Execution is stopped for specified amount of seconds and then automatically resumed (just like regular sleep) except without locking the reactor thread



70
71
72
73
74
# File 'lib/em-synchrony.rb', line 70

def self.sleep(secs)
  fiber = Fiber.current
  EM::Timer.new(secs) { fiber.resume }
  Fiber.yield
end

.sync(df) ⇒ Object

sync is a close relative to inlineCallbacks from Twisted (Python)

Synchrony.sync allows you to write sequential code while using asynchronous or callback-based methods under the hood. Example:

result = EM::Synchrony.sync EventMachine::HttpRequest.new(URL).get p result.response

As long as the asynchronous function returns a Deferrable object, which has a “callback” and an “errback”, the sync methond will automatically yield and automatically resume your code (via Fibers) when the call either succeeds or fails. You do not need to patch or modify the Deferrable object, simply pass it to EM::Synchrony.sync



47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
# File 'lib/em-synchrony.rb', line 47

def self.sync(df)
  f = Fiber.current
  xback = proc do |*args|
    if f == Fiber.current
      return args.size == 1 ? args.first : args
    else
      f.resume(*args)
    end
  end

  df.callback(&xback)
  df.errback(&xback)

  Fiber.yield
end