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

How to perform Asynchrnous task in rails using delayed_jobs?

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

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

举个例子: 我有一些项目要从数据库中删除,但我想以 Async 的方式删除。我还在 delayed_job 博客中阅读了 perform_laterperform_now 方法。这是我的代码,运行良好:

控制器class

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

工作class

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 作业是一回事吗?

编辑-1

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

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

rake jobs:work

有没有办法在 queue 获得一些新数据后立即执行 delay_job 任务?

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

PostJob.perform_later(params[:id])

它应该异步发生。如果没有,您还需要做一些设置。

您的问题:

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

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

编辑

根据对问题的编辑,似乎需要启动延迟作业守护进程。来自说明:

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

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

为此,将 gem "daemons" 添加到您的 Gemfile 并确保您已 运行 rails 生成 delayed_job.

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

RAILS_ENV=生产script/delayed_job开始 RAILS_ENV=生产script/delayed_job停止

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

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

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

RAILS_ENV=production script/delayed_job --queue=tracking start RAILS_ENV=production script/delayed_job --queues=mailers,tasks start

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

以下命令将为跟踪队列启动 1 个 worker,

2 个工作人员用于邮件程序和任务队列,2 个工作人员用于任何作业:

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

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

RAILS_ENV=生产 script/delayed_job 开始 --exit-on-complete

或在前台运行

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