我想在我的一个使用赛璐珞的项目中使用游泳池。然而,每当我在一个pools赛璐珞类上调用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”
它告诉我冒犯的那条线是/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

果然,我也犯了同样的错误。似乎是赛璐珞有缺陷,或者我没有正确加载依赖项。然而,在我试图解决这个问题的过程中,我确实失败了。我到底是做错什么了还是这是赛璐珞里的虫子?

最佳答案

似乎其他人以前也遇到过这个问题:https://github.com/celluloid/celluloid-pool/issues/10。我想这与Celluloid.services被弃用和不能在新版本的赛璐珞中工作有关,所以使用require 'celluloid/current'而不仅仅是require 'celluloid'似乎能起到作用。

10-05 20:32
查看更多