试图使用游泳池崩溃赛璐珞

时间:2016-09-07 21:36:48

标签: ruby threadpool jruby celluloid

我试图在我使用赛璐珞的项目中使用游泳池。但是,每当我在pool的Celluloid(从而接收来自include的方法)的类上调用Celluloid::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:未定义的方法`services&#39;赛璐珞:模块

它告诉我违规行为/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

为了确保问题不在我的特定项目中,我从this article抓取了一个代码示例,该示例使用了池并尝试运行它:

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',但无济于事。我在做错了什么,或者这是赛璐珞中的一个错误?

1 个答案:

答案 0 :(得分:2)

似乎其他人之前遇到过这个问题:https://github.com/celluloid/celluloid-pool/issues/10。我想这与Celluloid.services被弃用有关,而不是在较新版本的Celluloid中使用,所以使用require 'celluloid/current'而不仅仅是require 'celluloid'似乎可以解决这个问题。