Created
September 15, 2011 20:57
-
-
Save athoune/1220462 to your computer and use it in GitHub Desktop.
Orthodox Event Machine API + Fiber variants
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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