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
-
.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.
-
.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.
-
.gets ⇒ Object
Routes to EM::Synchrony::Keyboard.
-
.next_tick(&blk) ⇒ Object
Fiber-aware EM.next_tick convenience function.
-
.sleep(secs) ⇒ Object
Fiber-aware sleep function using an EM timer.
-
.sync(df) ⇒ Object
sync is a close relative to inlineCallbacks from Twisted (Python).
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 |
.gets ⇒ Object
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 |