任务:
以Async
方式[HomeWork]
我已经在我的rails应用程序中使用Active jobs
配置了delayed_jobs
,但我仍然对在rails项目中执行Async
任务感到困惑。
让我们举一个例子:
我有一些项目要从数据库中删除,但我想以Async
的方式进行。我还在perform_later
博客中了解了perform_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的official doc,我可以在方法的末尾添加handle_asynchronously
以async
方式运行。在这种情况下我该如何实施?
destroy
方法时,它不会以Async
方式删除元素。但是,使用destroy
方法编写的每个步骤都在Synchronous
中。我错了吗?destroy
方法以异步方式删除post
?在A Fader Darkly提出建议后,我将perform_now
更改为perform_later
,这对Async
进程完全有效,但它没有从表中删除条目(代码很好,因为它用户perform_now
时有效。
当我通过以下命令手动运行作业时,一切正常:
rake jobs:work
delay_job
获取一些新数据后,有没有办法执行queue
任务?
答案 0 :(得分:1)
如果您将destroy方法更改为:
PostJob.perform_later(params[:id])
它应该是异步发生的。如果没有,你可以做更多的设置。
对于你的问题:
perform_now
,作业队列未被使用。因此,destroy不会以异步方式删除。&#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停止
RAILS_ENV =生产脚本/ delayed_job -n 2开始 RAILS_ENV =生产脚本/ delayed_job停止
RAILS_ENV =生产脚本/ delayed_job --queue =跟踪开始 RAILS_ENV =生产脚本/ delayed_job --queues =邮件程序,任务开始
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