尝试使用池会导致 Celluloid 崩溃

Attempting to use pools crashes Celluloid

我正在尝试在我的一个使用 Celluloid 的项目中使用池。但是,每当我在 class 上调用 pool 方法时,includes Celluloid(因此从 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: undefined method `services' for Celluloid:Module

它告诉我违规行是 /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',但无济于事。我是不是做错了什么,或者这是 Celluloid 中的错误?

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