在rails应用程序的ruby中实现多线程

时间:2014-03-14 11:37:02

标签: ruby-on-rails multithreading

我编写了一个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

此处学生在数据库中的输入独立于其他学生,因此我们似乎可以同时更新多个学生的条目。我认为这只有通过多线程才能实现。

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

2 个答案:

答案 0 :(得分:0)

要生成新线程并使其使用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方法等待该线程完成,以防您在处理完所有记录后执行进一步的操作。

答案 1 :(得分:0)

如果您正在使用" classic" Ruby然后线程实际上并没有在parellel中执行,它们在OS中的一个ruby进程中运行。要获得真正的并行性,您应该使用processes

点击此处stackoverflow