在路轨的背景工作者螺纹

时间:2014-04-16 16:13:43

标签: ruby-on-rails ruby multithreading

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

1 个答案:

答案 0 :(得分:0)

由于您正在寻找后台处理库,很多人会推荐resquesidekiq。你可以查看at this sitepoint tutorial一篇比较延迟工作与其他两篇文章的好文章(我不知道那里有人如此评论)你可以看到这两者的良好比较in this stack overflow answer

要考虑的一个主要问题是,您希望在后台进程中运行的代码是否是安全的?如果它不坚持resque(我认为它更简单,意见问题)因为sidekiq运行并行工作(我确定你可以选择不这样做)。

示例代码:Redis(来自docs):

定义一些工作,找一份工作。乔布斯需要一种工作方法:

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

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

resque = Resque.new
resque << ImageConversionJob.new

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

bin/resque work

Sidekiq(来自链接的sitepoint文章):

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

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