Skip to content

Instantly share code, notes, and snippets.

@athoune
Created September 15, 2011 20:57
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save athoune/1220462 to your computer and use it in GitHub Desktop.
Save athoune/1220462 to your computer and use it in GitHub Desktop.
Orthodox Event Machine API + Fiber variants
require "em-http-request"
require "em-synchrony"
class Weather
include EventMachine::Deferrable
attr_reader :code, :date, :temp, :humidity, :wind_speed
def _feed code, raw
rough = raw.split('#')
@code = code
@date, @temp, @humidity, @wind_speed = rough[0..3]
end
def to_s
"<Weather: code=#{@code} temp=#{@temp} humidity=#{@humidity} wind_speed=#{@wind_speed}>"
end
end
def meteo icao, &block
response = Weather.new
response.callback(&block) if block_given?
http = EventMachine::HttpRequest.new("http://stationmeteo.meteorologic.net/metar/your-metar.php?type=mes&icao=#{icao}").get
http.errback do |error|
response.fail :system, error
end
http.callback do
response._feed icao, http.response
response.succeed response
end
response
end
puts "[Iterator]"
EventMachine.run do
EventMachine::Iterator.new(%w{LFRS LFLL LFML}).map(
proc do |airport, iter|
meteo airport do |score|
iter.return score
end
end,
proc do |scores|
puts scores
EM.stop
end
)
end
puts "\n## Fiber ##\n\n"
alias :ameteo :meteo
def meteo icao
f = Fiber.current
conn = ameteo icao
conn.callback{ f.resume(conn)}
conn.errback{|*errors| f.resume(*errors)}
Fiber.yield
end
puts "[Sequential]"
EventMachine.synchrony do
puts meteo "LFRS"
puts meteo "LFML"
EM.stop
end
puts "[Multi]"
EventMachine.synchrony do
multi = EventMachine::Synchrony::Multi.new
multi.add :satolas, ameteo("LFRS")
multi.add :paris, ameteo("LFLL")
responses = multi.perform.responses[:callback].values
puts responses
EventMachine.stop
end
puts "Iterator"
EventMachine.synchrony do
responses = EventMachine::Synchrony::Iterator.new(%w{LFRS LFLL LFML}).map do |airport, iter|
response = ameteo(airport) { iter.return response }
end
puts responses
EventMachine.stop
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment