我编写了一个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中实现多线程。
答案 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