2014-02-21 13 views
1

我有一个线程,在后台做了一些处理,使控制器更具响应性,但是,测试用例无法运行。它似乎锁定打印“EEEEEE”约5分钟。如何在线程中使用autotest/ActionController :: TestCase?

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

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

该线程超时时间为5秒,所以它不能取5-10m。

等待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) 
+0

我感觉Ruby人没有像Java人一样的线程经验。 – Chloe

回答

1

好,我解决它通过使用光纤!

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

奇怪的线程是行不通的。使用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 
+1

你应该接受你自己的答案。我碰到同样的问题,你的解决方案完美:) –