0

我正在考虑转移到 Torquebox,但我需要将我想要更改为 Service 的外部守护程序之一的 nice 级别设置为 19。在 Torquebox 中是否有任何等效的方法可以做到这一点,以便服务具有更低运行时间优先于其他任何东西,尤其是 Torquebox 的“网络”部分?

4

1 回答 1

1

服务只是符合 API TorqueBox 的 PORO 可以使用。TorqueBox 期望您在调用后尽快让他的线程返回Service#start,这就是为什么服务通常在单独的工作线程中运行并且您可以使用设置工作线程的优先级Thread#priority(参见https://github.com/jruby/jruby/ wiki/DifferencesBetweenMriAndJruby#thread-priority ) -Thread相当于nice

应该很简单:

class Service
  def start
    @worker = Thread.new do
      # do servicy stuff
    end
    @worker.priority = ...
  end

  def stop
    @worker.stop
  end

end

然而,Java 似乎在这方面遇到了一些依赖于操作系统的怪癖(请参阅Setting priority to Java's threadsThrottling CPU from inside Java),而 JRuby 继承了这些怪癖。

考虑到这些怪癖,如果所有其他方法都失败了,您总是可以时不时地执行 sleep 0.01 以稍微错开执行并为其他作业腾出 CPU 时间,您可以确定性地执行此操作 ( sleep 0.01 if count%100==0) 或者您可以不确定地执行此操作几乎相同的效果和更简单的代码 ( sleep 0.01 if random(100)==0) - 并使用确切的数字 (1, 10, 100, 1000, ...),

据我所知,EventMachine 在反应器线程中使用 sleep 0.01 来防止与 CPU 挂钩,这种方法并不像一开始听起来那么古怪。

于 2013-12-05T09:21:11.623 回答