복붙노트

[REDIS] 내 잘못 - EM ::의 Synchrony # 싱크 원인 '루트 섬유'FiberError의 간단한 사용?

REDIS

내 잘못 - EM ::의 Synchrony # 싱크 원인 '루트 섬유'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>'

나는이 깊은 혼란을 찾을 수 있습니다. 왜 일을하고 내가 잘못 생각하지 않는 이유는 무엇입니까? 그렇다면, 내가 무엇을 다르게 할 수 있습니까? 뭔가 이상 호도하지 않는 한,이 전각 동시성의 README 당, 코셔입니다.

해결법

  1. ==============================

    1.난 당신이 올바른 버전이 발견 될 경우 코드가 작동 할 수 있다고 생각이 느슨한 의존 한 문제가 원숭이 패치를 시도하는 그들을-hiredis.

    난 당신이 올바른 버전이 발견 될 경우 코드가 작동 할 수 있다고 생각이 느슨한 의존 한 문제가 원숭이 패치를 시도하는 그들을-hiredis.

    여기에 EM-동시성의 마스터 분기 기준으로 완전 작업 코드는하지만입니다 :

    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-동시성이 시행 또는 적어도 감지해야되는 사용되는 패치 보석의 정확한 버전을 확인하지 않는 한 보석 패치의 본질적 결함 방법입니다.

  2. from https://stackoverflow.com/questions/8750788/simple-use-of-emsynchronysync-causes-root-fiber-fibererror-my-fault by cc-by-sa and MIT license