require 'fiber'
require 'eventmachine'
class AsyncIO < EM::Connection
include EM::P::LineText2
def initialize df
@df = df
end
def receive_line line
@df.succeed line
end
end
def get_line
f = Fiber.current
df = EM::DefaultDeferrable.new
df.callback { |line| f.resume(line) }
EM.connect '127.0.0.1', 3000, AsyncIO, df
return Fiber.yield
end
EM.run {
Fiber.new {
line = get_line
puts line
EM.stop
}.resume
}The truth is you should look at EM::Sychrony. Ilya Grigorik explains in he own Blog, how Fibers can help you write synchronous code while keeping the goodness of AsyncIO (ala EventMachine).
I don't find event driven code to be "callback hell" like Ilya Grigorik does. I find evented code easier to read than synchronous code sometimes. In Synchronous code you have to check every time if it failed and why. That is
if (rc < 0)with
switch (errno) case EINTR:code after every network call. In event driven code that stuff is dealt with in the event-loop and you just have to define the error callback once.
Ah well just use Node.js . If JavaScript event driven programming is "to hard" for your delicate sensibilities then explain to me how Millions of Web-monkeys pull it off everyday in the browser.
No comments:
Post a Comment