【问题标题】:Rails - running threads after method has exitedRails - 方法退出后运行线程
【发布时间】: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


【解决方案1】:

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

这个策略可能会对你有所帮助。

【讨论】:

    【解决方案2】:

    您需要使用delayed_job 或无论何时gem 进行后台任务,但我想建议sidekiq

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-21
      • 2016-07-27
      相关资源
      最近更新 更多