如何使用delayed_jobs在rails中执行Asynchrnous任务?

时间:2015-06-30 11:19:01

标签: ruby-on-rails ruby asynchronous delayed-job rails-activejob

任务: 以Async方式[HomeWork]

删除项目

我已经在我的rails应用程序中使用Active jobs配置了delayed_jobs,但我仍然对在rails项目中执行Async任务感到困惑。

让我们举一个例子: 我有一些项目要从数据库中删除,但我想以Async的方式进行。我还在perform_later博客中了解了perform_nowdelayed_job方法。这是我的代码工作正常:

控制器类

 def destroy
   PostJob.perform_now(params[:id])
   respond_to do |format|
    format.xml  { head :ok }
    format.js { render 'posts.js.erb' }
  end
 end

工作类

class PostJob < ActiveJob::Base
 queue_as :default

 def perform(id)
  @post = Post.find(id)
  @post.destroy
 end
end

根据delayed_jobs的official doc,我可以在方法的末尾添加handle_asynchronouslyasync方式运行。在这种情况下我该如何实施?

我的问题:

  1. 当我查看destroy方法时,它不会以Async方式删除元素。但是,使用destroy方法编写的每个步骤都在Synchronous中。我错了吗?
  2. 如果不是,那么如何实现destroy方法以异步方式删除post
  3. 后台任务和cron工作是一回事吗?
  4. 编辑-1

    在A Fader Darkly提出建议后,我将perform_now更改为perform_later,这对Async进程完全有效,但它没有从表中删除条目(代码很好,因为它用户perform_now时有效。

    当我通过以下命令手动运行作业时,一切正常:

    rake jobs:work
    

    delay_job获取一些新数据后,有没有办法执行queue任务?

1 个答案:

答案 0 :(得分:1)

如果您将destroy方法更改为:

PostJob.perform_later(params[:id])

它应该是异步发生的。如果没有,你可以做更多的设置。

对于你的问题:

  1. 是的你是对的,但你说的是重言式。该方法中的所有内容都是同步的 - 由于perform_now,作业队列未被使用。因此,destroy不会以异步方式删除。
  2. 见上文。
  3. Cron作业在操作系统级别上工作,并在特定时间定期安排。例如,您可以每分钟工作一次cron工作,或者每天或每周工作(特定时间的特定日期)。它们从名为crontab的计划文件运行。
  4. &#39; Backgrounding&#39;任务只是阻止它接管终端会话的IO。因此,当进程在后台运行时,您可以继续使用终端。通常这是在临时的基础上完成的,因此您不必等待繁重的操作完成,然后再继续执行不同的任务。

    修改

    根据对问题的编辑,听起来需要启动延迟作业守护程序。从说明中:

    注意:对于Rails 4,用bin / delayed_job替换script / delayed_job 在本地运行队列时,省略&#39; RAILS_ENV = production&#39;命令的一部分。

    运行工作 script / delayed_job可用于管理将开始处理作业的后台进程。

    为此,请添加gem&#34;守护进程&#34;到你的Gemfile并确保你运行rails generate delayed_job。

    然后您可以执行以下操作:

    RAILS_ENV =生产脚本/ delayed_job启动 RAILS_ENV =生产脚本/ delayed_job停止

    在不同的进程中运行两个worker。

    RAILS_ENV =生产脚本/ delayed_job -n 2开始 RAILS_ENV =生产脚本/ delayed_job停止

    将--queue或--queues选项设置为从特定队列开始工作。

    RAILS_ENV =生产脚本/ delayed_job --queue =跟踪开始 RAILS_ENV =生产脚本/ delayed_job --queues =邮件程序,任务开始

    使用--pool选项指定工作池。您可以多次使用此选项为不同的队列启动不同数量的工作程序。

    以下命令将为跟踪队列

    启动1个worker

    2名工作人员负责邮寄和任务队列,2名工作人员负责任何工作:

    RAILS_ENV =生产脚本/ delayed_job --pool = tracking --pool = mailers,tasks:2 --pool = *:2 start

    运行所有可用作业,然后退出

    RAILS_ENV =生产脚本/ delayed_job start --exit-on-complete

    或在前台运行

    RAILS_ENV =生产脚本/ delayed_job运行--exit-on-complete