ruby-on-rails - Rails - 从 Controller 运行 rake 任务或新线程?

标签 ruby-on-rails ruby-on-rails-3 multithreading rake rake-task

我有一个类 (/lib/updater.rb) 对数据库进行大量更新(调用外部服务器、计算...)。通常这个任务由服务器的 cron 调用(rake/lib/tasks/launch_updater.rake 启动 updater.rb),但我想给也有机会从客户端手动启动它。

此时,用户可以从客户端点击一个按钮并以这种方式启动它:

# the controller
Thread.new {
  Updater.start
}

这是一个很好的解决方案还是直接从 rake 任务启动更好?

# something like this from the controller
Rake::Task[params[:task]].reenable 
Rake::Task[params[:task]].invoke

任务应该是无阻塞的(用户应该在应用程序上正常导航,而无需等待任务结束)。

哪个更好,为什么?

最佳答案

对我的问题进行了一些研究后,我发现了以下注释:

  • 使用线程时,使用的 CPU 与应用程序的 CPU 相同(即使您有一个多核服务器,CPU 也是相同的)。如果您想使用 Thread,Thread 任务不应“繁重”,否则您可能会遇到 CPU 问题(应用处理速度慢)。
  • 当您从终端或服务器 cron 启动 Rake 任务时,这应该占用运行较轻的进程的 CPU。但是,如果您从应用程序启动任务,我认为 CPU 甚至与应用程序相同。
  • 处理繁重任务的更好解决方案是使用延迟服务,通过这种方式,作业任务应该占用应用程序 CPU 之外的另一个 CPU,而不会影响应用程序的性能:

关于ruby-on-rails - Rails - 从 Controller 运行 rake 任务或新线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18508106/

相关文章:

java - 使用 hibernate 通过多个线程保存多个实体

ruby-on-rails - 如何从嵌套表单发送参数?

ruby-on-rails - 带有 Mongoid 的 Rails 模块

jquery - 是否可以在 render partial 中传递参数?

ruby-on-rails - Rails 3 - belongs_to user AND has_many users

java - Java多线程性能,创建新对象或者使用synchronized

java - 我如何知道 ExecutorService 中的所有线程何时完成?

ruby-on-rails - 是否可以在映射路由之前对 URL 进行预处理?

ruby-on-rails - 如何在 AWS Elastic Beanstalk 上为 Rails 应用程序播种数据库

ruby-on-rails-3 - 如何从 Rails 3 中的模型获取实际的 HTTP 请求?