如何使用 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_later
或 perform_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_asynchronously
以async
方式添加到运行。在这种情况下我该如何实施?
我的问题:
- 当我查看
destroy
方法时,它并没有以 Async
的方式删除元素。然而,在 destroy
方法中编写的每个步骤都在 Synchronous
中。我错了吗?
- 如果不是,那么我如何实现
destroy
方法以异步方式删除 post
?
- 后台任务和 cron 作业是一回事吗?
编辑-1
在 A Fader Darkly 给出建议后,我将 perform_now
更改为 perform_later
,这对 Async
进程非常有效,但它没有从 table 中删除条目(代码很好,因为它在我用户 perform_now
时有效)。
另外,当我通过以下命令手动 运行 宁作业时,一切正常:
rake jobs:work
有没有办法在 queue
获得一些新数据后立即执行 delay_job
任务?
如果您将销毁方法更改为调用:
PostJob.perform_later(params[:id])
它应该异步发生。如果没有,您还需要做一些设置。
您的问题:
- 是的,你是对的,但你说的是同义反复。该方法中的所有内容都是同步的 - 由于
perform_now
,作业队列未被使用。因此 destroy 不是以异步方式删除。
- 见上文。
- 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
任务:
以 Async
方式删除项目 [HomeWork]
我已经在我的 rails 应用程序中用 delayed_jobs
配置了 Active jobs
,但我仍然对在 rails 项目中执行 Async
任务感到困惑。
举个例子:
我有一些项目要从数据库中删除,但我想以 Async
的方式删除。我还在 delayed_job
博客中阅读了 perform_later
或 perform_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_asynchronously
以async
方式添加到运行。在这种情况下我该如何实施?
我的问题:
- 当我查看
destroy
方法时,它并没有以Async
的方式删除元素。然而,在destroy
方法中编写的每个步骤都在Synchronous
中。我错了吗? - 如果不是,那么我如何实现
destroy
方法以异步方式删除post
? - 后台任务和 cron 作业是一回事吗?
编辑-1
在 A Fader Darkly 给出建议后,我将 perform_now
更改为 perform_later
,这对 Async
进程非常有效,但它没有从 table 中删除条目(代码很好,因为它在我用户 perform_now
时有效)。
另外,当我通过以下命令手动 运行 宁作业时,一切正常:
rake jobs:work
有没有办法在 queue
获得一些新数据后立即执行 delay_job
任务?
如果您将销毁方法更改为调用:
PostJob.perform_later(params[:id])
它应该异步发生。如果没有,您还需要做一些设置。
您的问题:
- 是的,你是对的,但你说的是同义反复。该方法中的所有内容都是同步的 - 由于
perform_now
,作业队列未被使用。因此 destroy 不是以异步方式删除。 - 见上文。
- 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