我有一个在后台进行一些处理以使控制器响应更快的线程,但是,测试用例无法运行。它似乎锁定了'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)
答案 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