【问题标题】:Background worker thread in Rails [duplicate]Rails中的后台工作线程[重复]
【发布时间】:2014-04-16 16:13:43
【问题描述】:

我正在开发一个 ruby​​&rails 应用程序,其要求如下:在接收到 HTTP 请求时,控制器必须将数据存储在数据库中并将成功返回给最终用户。此时,我想要一个后台线程唤醒并对添加的数据执行操作。我在开发模式下使用 WEBRick 服务器。如何实现这个功能?

【问题讨论】:

标签: ruby-on-rails ruby multithreading


【解决方案1】:

由于您正在寻找后台处理库,很多人推荐resquesidekiq。你可以在at this sitepoint tutorial 上找到一篇比较延迟作业和其他两个的好文章(我不知道那一篇所以在这里不做评论),你可以看到这两个in this stack overflow answer 的一个很好的比较。

要考虑的主要问题之一是您希望在后台进程中运行的代码是否安全?如果它不坚持使用 resque(我认为无论如何它更简单,见仁见智),因为 sidekiq 运行并行作业(我相信你可以选择不这样做)。

示例代码:Redis(来自文档):

要定义一些工作,就做一个工作。工作需要工作方法:

class ImageConversionJob
  def work
    # convert some kind of image here
  end
end

接下来,我们需要拖延!让我们把你的工作放在队列中:

resque = Resque.new
resque << ImageConversionJob.new

整洁!这个工作单元将存储在 Redis 中。我们可以启动一个工作人员从队列中获取一些工作并完成工作:

bin/resque work

Sidekiq(来自链接的站点文章):

class PrintWorker
  include Sidekiq::Worker

  def perform(str)
    puts str
  end
end

再一次,我们必须在某处排队作业(我们将在索引控制器中完成):

class IndexController < ApplicationController
  def index
    PrintWorker.perform_async(params[:to_print])
  end
end

最后,我们必须启动 Sidekiq 进程。在 Rails 应用程序根目录的 shell 中输入:

bundle exec sidekiq

这只是一个简短的概要和足够的语法来获得答案的味道。有关更多详细信息,请参阅链接文章。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-03-10
    • 2019-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-05
    • 2011-06-18
    相关资源
    最近更新 更多