【发布时间】:2019-03-27 02:53:15
【问题描述】:
当客户更改他的个人资料图片时,它会点击update 方法,该方法以update.js.erb 响应。这是一个快速而直接的过程。但是,在服务器的幕后,从个人资料图片中生成了一堆文件(其中 10 个),这些文件需要从服务器上传到 Amazon 存储桶。这是一个漫长的过程,我不想让客户等到它完成。此外,文件上传通常会失败并显示 RequestTimeoutException,因为它们需要超过 15 秒。
所有这些都引发了许多问题:
update方法退出后如何进行10个文件的生成/上传?线程在 main 方法完成后被杀死。
如何在线程中捕获异常?下面的代码没有捕捉到超时异常。
threads = []
threads << Thread.new {
begin
# upload file 1 ....
rescue Rack::Timeout::RequestTimeoutException => e
# try to upload again ....
else
ensure
end
}
threads << Thread.new {
begin
# upload file 2 ....
rescue Rack::Timeout::RequestTimeoutException => e
# try to upload again ....
else
ensure
end
}
threads.each { |thr|
thr.join
}
如果文件超时,尝试再次上传文件的最佳方法是什么?
这个问题的最佳解决方案是什么?
【问题讨论】:
-
为什么不使用像github.com/mperham/sidekiq 这样支持良好的后台作业gem?
-
您可以通过 ajax 将这些照片以 3 张为一组发送。这将减少时间,并向用户提供一些反馈。
-
就像@lacostenycoder 所说,使用 Sidekiq 或 Resque 或其他异步作业处理器。
标签: ruby-on-rails ruby multithreading exception