2

任务:以方式删除一个项目Async[HomeWork]

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

让我们举个例子:我有一些项目要从数据库中删除,但我想以某种Async方式进行。我还在博客中阅读了有关perform_laterperform_now方法的信息。delayed_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的官方文档,我可以handle_asynchronously在方法的末尾添加以运行async方式。在这种情况下我该如何实施?

我的问题:

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

编辑-1

在 A Fader Darkly 给出建议后,我将其更改perform_nowperform_later对进程非常有效,Async但它没有从表中删除条目(代码很好,因为它在我用户时有效perform_now)。

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

rake jobs:work

有什么方法可以在获得一些新数据delay_job后立即执行任务?queue

4

1 回答 1

1

如果您将销毁方法更改为调用:

PostJob.perform_later(params[:id])

它应该异步发生。如果没有,您还有更多的设置要做。

对于您的问题:

  1. 是的,您是对的,但是您所说的是同义反复。该方法中的所有内容都是同步的 - 由于perform_now. 因此,destroy 不会以异步方式删除。
  2. 看上面。
  3. Cron 作业在操作系统级别工作,并定期安排在特定时间。例如,您可以让 cron 作业每分钟、每天或每周(在特定日期的特定时间)都在工作。它们从称为 crontab 的计划文件运行。

“后台”任务只是阻止它接管终端会话的 IO。因此,您可以在进程在后台运行时继续使用终端。通常这是临时完成的,因此您不必等待繁重的操作完成后再继续执行不同的任务。

编辑

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

注意:对于 Rails 4,将 script/delayed_job 替换为 bin/delayed_job 在本地运行队列时,请省略命令的“RAILS_ENV=production”部分。

Running Jobs script/delayed_job 可用于管理将开始工作的后台进程。

为此,请将 gem“守护程序”添加到您的 Gemfile 中,并确保您已运行 rails generate delayed_job。

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

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

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

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

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

RAILS_ENV=生产脚本/delayed_job --queue=跟踪开始 RAILS_ENV=生产脚本/delayed_job --queues=mailers,tasks start

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

以下命令将为跟踪队列启动 1 个工作人员,

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

于 2015-06-30T11:53:38.347 回答