9

我有一个 Rails 应用程序,其中少量操作需要大量计算时间。我发现我可以将处理拆分为多个线程,并且通过将 JRuby 与多核服务器一起使用,我可以确保所有线程在合理的时间内完成,而不是将这些操作作为后台任务进行管理的复杂性。(客户已经表达了对保持这种方法而不是在后台运行任务的强烈兴趣。)

问题是写入 Rails 记录器在这些线程中不起作用。日志文件中没有显示任何内容。我找到了一些关于这个问题的参考资料,但没有解决方案。我不介意在我的代码中插入 puts 来帮助调试,但标准输出似乎被 glassfish gem 应用服务器吃掉了。

有没有人在没有每次都创建新日志的情况下成功地在 Rails ruby​​ 线程中完成日志记录?

4

2 回答 2

6

我正在为同样的问题挠头。对我来说,答案如下:

Thread.new do
  begin
    ...
  ensure
    Rails.logger.flush
  end
end
于 2010-08-18T19:41:48.843 回答
0

我理解您对后台任务的担忧,但请记住,在 Rails 中分离线程可能是一件可怕的事情。该框架几乎没有提供多线程,这意味着您必须将所有 Rails 对象视为不是线程安全的。甚至数据库连接也变得棘手。

至于记录器:标准的 Ruby 记录器类应该是线程安全的。但即使 Rails 使用它,您也无法控制 Rails 应用程序对其执行的操作。例如,基准测试机制将通过切换级别来“静音”记录器。

我会避免使用 rails logger。如果要使用线程,请在线程内创建一个新的记录器来记录该操作的消息。如果您不想为每个线程创建一个新日志,您还可以尝试在运行时创建一个每个线程都可以访问的线程安全日志记录对象。

在您的位置,我可能会再看一下后台工作解决方案。虽然 DRb 看起来像一场噩梦,但“bj”看起来又好又容易;尽管它需要一些工作才能使其与 JRuby 一起运行。还有使用 JRuby 中的 Java 调度程序的替代方法,请参阅http://www.jkraemer.net/2008/1/12/job-scheduling-with-jruby-and-rails

于 2009-10-21T10:39:39.430 回答