Rails-方法退出后运行线程

时间:2018-10-23 00:17:46

标签: ruby-on-rails ruby multithreading exception

当客户更改其个人资料照片时,它将点击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
}

如果超时,尝试重新上传文件的最佳方法是什么?

此问题的最佳解决方案是什么?

2 个答案:

答案 0 :(得分:2)

您需要使用delay_job或gem来执行后台任务,但是我想建议sidekiq

答案 1 :(得分:0)

我在一个项目中也遇到了同样的问题。我遇到了一个使用AWS lambda的解决方案。如果您正在使用导轨将图像上传到S3,则可以使用carrierwave gem / rails 5活动存储模块。如果您不使用滑轨,则使用AWS-SDK进行红宝石上传,以在S3上上传文件。只要在S3上创建/修改文件,就可以绑定事件。每当创建文件时,它都会调用lambda函数,您的工作就完成了。可以将它们绑定到lambda函数。在lambda函数中,您可以编写逻辑来创建文件并将其上传回s3。您可以用ruby,node和python编写lambda代码。

此策略可能会为您提供帮助。