2012-01-05 1 views
2

Эта программаПростое использование EM :: Synchrony # sync вызывает «корневое волокно» FiberError - моя ошибка?

require 'em-synchrony' ## v1.0.0                                
require 'em-hiredis' ## v0.1.0                                

module EventMachine 
    module Hiredis 
    class Client 

     def self.connect(host = 'localhost', port = 6379) 
     conn = new(host, port) 
     EM::Synchrony.sync conn.connect 
    conn 
     end 

     alias :old_method_missing :method_missing 
     def method_missing(sym, *args) 
     EM::Synchrony.sync old_method_missing(sym, *args) 
     end 
    end 
    end 
end 

EventMachine.synchrony do 
    redis = EM::Hiredis.connect 

    redis.set('foo', 'bar') 
    puts redis.get('foo') 

    EM.stop 
end 

умирает как этот

$ ruby /tmp/reddy.rb 
/home/blt/.rvm/gems/ruby-1.9.3-p0/gems/em-synchrony-1.0.0/lib/em-synchrony.rb:58:in `yield': can't yield from root fiber (FiberError) 
    from /home/blt/.rvm/gems/ruby-1.9.3-p0/gems/em-synchrony-1.0.0/lib/em-synchrony.rb:58:in `sync' 
    from /tmp/reddy.rb:16:in `method_missing' 
    from /home/blt/.rvm/gems/ruby-1.9.3-p0/gems/em-hiredis-0.1.0/lib/em-hiredis/client.rb:119:in `select' 
    from /home/blt/.rvm/gems/ruby-1.9.3-p0/gems/em-hiredis-0.1.0/lib/em-hiredis/client.rb:38:in `block in connect' 
    from /home/blt/.rvm/gems/ruby-1.9.3-p0/gems/em-hiredis-0.1.0/lib/em-hiredis/event_emitter.rb:8:in `call' 
    from /home/blt/.rvm/gems/ruby-1.9.3-p0/gems/em-hiredis-0.1.0/lib/em-hiredis/event_emitter.rb:8:in `block in emit' 
    from /home/blt/.rvm/gems/ruby-1.9.3-p0/gems/em-hiredis-0.1.0/lib/em-hiredis/event_emitter.rb:8:in `each' 
    from /home/blt/.rvm/gems/ruby-1.9.3-p0/gems/em-hiredis-0.1.0/lib/em-hiredis/event_emitter.rb:8:in `emit' 
    from /home/blt/.rvm/gems/ruby-1.9.3-p0/gems/em-hiredis-0.1.0/lib/em-hiredis/connection.rb:15:in `connection_completed' 
    from /home/blt/.rvm/gems/ruby-1.9.3-p0/gems/eventmachine-1.0.0.beta.4/lib/eventmachine.rb:179:in `run_machine' 
    from /home/blt/.rvm/gems/ruby-1.9.3-p0/gems/eventmachine-1.0.0.beta.4/lib/eventmachine.rb:179:in `run' 
    from /home/blt/.rvm/gems/ruby-1.9.3-p0/gems/em-synchrony-1.0.0/lib/em-synchrony.rb:27:in `synchrony' 
    from /tmp/reddy.rb:22:in `<main>' 

Я нахожу это глубоко запутанной. Почему это не работает, и я виноват? Если да, то что я могу сделать по-другому? Если я не затушевываю что-то, это кошерный, за em-synchrony README.

ответ

1

Я думаю, что ваш код может работать, если вы найдете правильную версию em-hiredis, пытаясь установить патч обезьяны, то есть одну проблему со свободными зависимостями.

Вот полностью рабочий код, но на основе мастер-ветви эм-синхронности:

Gemfile:

source :rubygems 

gem 'em-synchrony', :git => "git://github.com/igrigorik/em-synchrony.git" 
gem 'em-hiredis', '~> 0.1.0' 

test.rb:

require 'rubygems' 
require 'bundler/setup' 

require 'em-synchrony' 
require 'em-synchrony/em-hiredis' 

EventMachine.synchrony do 
    redis = EM::Hiredis.connect 

    redis.set('foo', 'bar') 
    puts redis.get('foo') 

    EM.stop 
end 

, а затем запустить его с :

$ bundle 
$ ruby test.rb 

Патч для обезьян - это по своей сути ошибочный способ исправления драгоценных камней, если вы не гарантируете, что используется точная версия драгоценного камня, который вы исправили, что-то, что em-synchrony должно обеспечить или, по крайней мере, обнаружить.

+0

См. Также [эта ошибка] (https://github.com/igrigorik/em-synchrony/issues/103). – troutwine