我正在尝试在我的一个使用赛璐珞的项目中使用池。但是,每当我在赛璐珞pool
类的类上调用该方法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:赛璐珞的未定义方法“服务”:模块
它告诉我违规行是/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
果然,我得到了完全相同的错误。似乎赛璐珞中有一个错误,或者我没有正确加载依赖项。但是,require 'celluloid/supervision'
我尝试解决此问题,但无济于事。我做错了什么还是赛璐珞中的一个错误?