加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby-on-rails – 使用活动记录在rails控制台中进行线程处理时,

发布时间:2020-12-17 02:28:18 所属栏目:百科 来源:网络整理
导读:我正在使用Rails 3和 Ruby 1.9. 我在各种rails测试中(以及在控制台中)运行了2种方法.这些方法称为index_cases和index_new_cases,方法体如下所示. index_new_cases方法的内容可能不相关(我使用Sunspot gem索引ModelCase信息),但为了完整性我将其留在那里. 我
我正在使用Rails 3和 Ruby 1.9.

我在各种rails测试中(以及在控制台中)运行了2种方法.这些方法称为index_cases和index_new_cases,方法体如下所示. index_new_cases方法的内容可能不相关(我使用Sunspot gem索引ModelCase信息),但为了完整性我将其留在那里.

我有3个case_numbers.每个case_number都匹配数据库中的ModelCase(即db中有3个ModelCase记录).

当我使用这3个case_numbers在index_cases方法上运行测试时,index_new_cases方法不会使用ModelCase.where …方法检索任何情况.但是,如果我删除index_cases方法中的“线程”调用,index_new_cases函数现在检索所有3个案例并正确索引它们.

任何人都可以向我解释为什么我的线程找不到数据库记录?
我的线程实现是错误的吗?
谢谢!

def index_cases(case_numbers)
    threads = []
    case_numbers.each_slice(500) do |slice_of_case_numbers|
      threads << Thread.new(slice_of_case_numbers) do |a_slice|
        index_new_cases(a_slice)
      end
    end
    threads.each {|thr| thr.join}
  end

  def index_new_cases(case_numbers)
    cs = ModelCase.where(case_number: case_numbers).includes(:child_tables)
    puts cs.size # prints 0 with threading and 3 without threading
    Sunspot.index(cs)
    Sunspot.commit
  end

此方法(没有线程)可以正常查找和索引我的数据库记录

def index_cases(case_numbers)
    #threads = []
    case_numbers.each_slice(500) do |slice_of_case_numbers|
      #threads << Thread.new(slice_of_case_numbers) do |a_slice|
        index_new_cases(slice_of_case_numbers)
     #end
    end
    #threads.each {|thr| thr.join}
  end

解决方法

我有一个非常类似的问题,但只是在测试中.

问题在于测试用例中使用的事务(当事务装置打开时) – 只要事务未提交,其他连接就不会看到对数据的更改.

见http://api.rubyonrails.org/classes/ActiveRecord/Transactions/ClassMethods.html

As a consequence changes to the database are not seen outside your
connection until the operation is complete.

线程应该与数据库建立新连接.而且由于在使用事务性装置时,整个测试运行都包含在一个事务中,除了它们自己创建的内容之外,线程中的任何内容都不可见.

您可以关闭交易,幸运的是还可以进行单项测试:http://ar.rubyonrails.org/classes/Fixtures.html

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读