4

セルロイドを使用する私のプロジェクトでプールを使用しようとしています。ただし、セルロイドpoolのクラスでメソッドを呼び出すと(したがって、からメソッドを受け取る)、一貫してエラーが発生します。includeCelluloid::ClassMethods

NoMethodError: undefined method `services' for Celluloid:Module
     router at /Users/my_username/.rvm/gems/jruby-9.0.5.0/gems/celluloid-supervision-0.20.6/lib/celluloid/supervision/deprecate/supervise.rb:54
  supervise at /Users/my_username/.rvm/gems/jruby-9.0.5.0/gems/celluloid-supervision-0.20.6/lib/celluloid/supervision/deprecate/supervise.rb:6
       pool at /Users/my_username/.rvm/gems/jruby-9.0.5.0/gems/celluloid-pool-0.20.5/lib/celluloid/supervision/container/behavior/pool.rb:13
      <top> at celluloid_pool_test.rb:14

具体的には、この部分が問題のようです。

NoMethodError: Celluloid:Module の未定義のメソッド「services」

問題のある行は/Users/my_username/.rvm/gems/jruby-9.0.5.0/gems/celluloid-supervision-0.20.6/lib/celluloid/supervision/deprecate/supervise.rb:54. Celluloid::Supervision.router行にメソッドのコードが含まれていることがわかります。

def router(*_args)
  # TODO: Actually route, based on :branch, if present; or else:
  Celluloid.services ### this line is what causes the error
end

問題が私の特定のプロジェクトにないことを確認するために、この記事からプールを利用するコード サンプルを取得し、それを実行しようとしました。

require 'celluloid'
require 'mathn'

class PrimeWorker
  include Celluloid

  def prime(number)
    if number.prime?
      puts number
    end
  end  
end

pool = PrimeWorker.pool

(2..1000).to_a.map do |i|
  pool.prime! i
end

sleep 100

私のプロジェクトとまったく同じエラーで失敗しました:

最後に、IRB で非常に単純なコードを実行して、pool何が原因でエラーが発生するかを確認しましたservices

class Foo
  include Celluloid
end
Foo.pool

案の定、まったく同じエラーが発生しました。Celluloid にバグがあるか、依存関係を適切にロードしていないようです。しかし、私はrequire 'celluloid/supervision'これを解決しようとしましたが、役に立ちませんでした。私は自分の側で何か間違ったことをしていますか、それともセルロイドのバグですか?

4

1 に答える 1