如何在线程中使用autotest / ActionController :: TestCase?

时间:2014-02-21 01:18:01

标签: ruby multithreading ruby-on-rails-4 thread-safety autotest

我有一个在后台进行一些处理以使控制器响应更快的线程,但是,测试用例无法运行。它似乎锁定了'EEEEEE'打印约5分钟。

这是我在控制器中的线程。 exit似乎没有什么区别。

  Thread.new do # don't delay user response
    @post.fetchImage
    @post.save
    Thread.exit
  end

该线程的超时时间为5秒,因此不能占用5-10米。

等待10米后,它会吐出错误:

  1) Error:
PostIntegrationTest#test_sweep_redistributes_balances_correctly:
ActiveRecord::ConnectionTimeoutError: could not obtain a database connection within 5.000 seconds (waited 5.002 seconds)

1 个答案:

答案 0 :(得分:1)

好的,我使用Fibers解决了它!

  f = Fiber.new do # don't delay user response
    @post.fetchImage
    @post.save
  end
  f.resume

很奇怪Thread不会工作。使用Ruby 2.0.0。


好吧这比我更奇怪!光纤会阻止对服务器中浏览器的响应!

  # Threads don't work in test, and Fibers are not asynchronous in the server!
  if Rails.env == 'test'
    f = Fiber.new do # don't delay user response
      @post.fetchImage
      @post.save
    end
    f.resume
  else 
    Thread.new do # don't delay user response
      @post.fetchImage
      @post.save
    end
  end

这似乎不对......


好的,我发现了一种不同的方式,这似乎更合适。我很惊讶Rails没有自动检查一个线程的数据库连接,并在线程在后台完成时重新检查。

    Thread.new do # don't delay user response
      ActiveRecord::Base.connection_pool.with_connection do # checkout/checkin DB connection
        @post.fetchImage
        @post.save
      end
      # ActiveRecord::Base.connection_pool.clear_stale_cached_connections! # Paranoid mode
    end