2012-01-05 7 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の正しいバージョンが見つかった場合、あなたのコードはうまくいくと思います。それは、疎結合の問題です。

はここで完全に動作するコードが、あるEM-同期のmasterブランチに基づく:

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 

Monkey patchingは、パッチ適用された宝石の正確なバージョンが使用されているかどうかを確認しないかぎり、本質的に欠陥のある宝石の修正方法です。

+0

[このバグ](https://github.com/igrigorik/em-synchrony/issues/103)も参照してください。 – troutwine

関連する問題