【问题标题】:Implementing multithreading in ruby on rails application在 ruby​​ on rails 应用程序中实现多线程
【发布时间】:2014-03-14 20:22:16
【问题描述】:

我编写了一个 Rails 应用程序,它有一组学生数据库,并且该数据库在 rake 任务的帮助下每天更新。我的意思是这个任务更新对应于每个学生 id 的条目,即第一个学生 id 1,然后是学生 id 2,依此类推,如下所示:

task :update_db => :environment do
   student_ids = Student.map{|x|x.id}
   student_ids.each do |sid|
    begin
      StudentHelper.update_db_entry(sid)
    rescue Exception => e
      Rails.logger.info "#{e.message}"
      Rails.logger.info "#{e.backtrace.inspect}"
    end
   end
end

这里一个学生在数据库中的条目是独立于其他学生的,所以看起来我们可以同时更新多个学生的条目。我认为这只能通过多线程实现。

我不知道如何继续,我不知道如何在 ruby​​ on rails 应用程序中实现多线程。

【问题讨论】:

  • 这里可能不需要多线程,除非您遇到严重的性能问题。此外,大量线程会占用您的数据库,这意味着使用该数据库的其他应用程序的响应速度会降低

标签: ruby-on-rails multithreading


【解决方案1】:

要生成一个新线程并使其使用 AR 模型完成一些工作,请使用以下代码:

thread = Thread.new do 
  ActiveRecord::Base.connection_pool.with_connection do
    #your code updating students here
  end
end

您需要将 ID 号分成相等的部分,并为每个线程分配一个部分。由于每个线程都需要来自池的数据库连接,因此您可以快速耗尽可用连接,因此不要使用太多。池中的db连接数在config/database.yml中设置。

您可以使用线程对象的join 方法等待该线程完成,以防您希望在处理完所有记录后执行进一步的操作。

【讨论】:

    【解决方案2】:

    如果您使用的是“经典”Ruby,那么线程实际上并没有并行执行,它们在操作系统中的一个 ruby​​ 进程中运行。对于真正的并行性,您应该使用processes

    在这里查看更多stackoverflow

    【讨论】:

      猜你喜欢
      • 2011-01-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-15
      • 2017-12-09
      • 1970-01-01
      相关资源
      最近更新 更多