【问题标题】:Trying to run Python script without interrupting Rails server尝试在不中断 Rails 服务器的情况下运行 Python 脚本
【发布时间】:2018-07-11 20:37:49
【问题描述】:

我正在尝试从 Rails 应用程序运行 Python 脚本。该脚本可以通过调用将进度更新发布到 Rails 服务器:

requests.post('http://127.0.0.1:3000/progress', data={'progress':'10'})

我尝试了几种方法让 Rails 服务器启动 Python 脚本并立即继续其其余工作。它需要能够免费响应用户并接收上述进度更新。

我试过了:

  • 在同时渲染视图的控制器方法中:

    system `python3 /path/to/script.py`
    out, err, st = Open3.capture3('python3', 'path/to/script.py')
    
  • 以上两者都在 after_action 中。
  • 以上两个都在 active_job 中。

在每种情况下,一旦启动脚本,服务器基本上就会挂起,就好像它在等待一样。我正在使用的测试脚本发送一个进度更新然后退出,因此即使服务器正在等待它完成它也不应该造成重大延迟。

这里发生了什么,如何在后台正确运行脚本以便我的 Rails 服务器可以响应它?

【问题讨论】:

  • 为什么需要从rails调用python脚本?如果它像守护进程一样持续运行,那么您应该能够使用某种使进程保持活动状态的运行器来运行它。
  • 它不是一直在运行 - Rails 一直在运行,有时它需要运行一个 Python 脚本,该脚本可能会立即结束或需要一些时间才能完成。
  • 您可能想查看after_action 上的注释 - 回调放置在控制器方法完成之后但在发送响应之前。您最可能需要的是一份单独的工作。
  • 我已经尝试过使用 Sidekiq 的 active_job - 到目前为止,它正在产生我提到的问题。

标签: ruby-on-rails python-requests ruby-on-rails-5 rails-activejob


【解决方案1】:

ActiveJob 应该可以工作。试试这个:

  1. 在控制台生成一个新的 Job rails g job SlowPython

  2. 将您的慢速 Python 脚本移至 app/jobs/script.py

  3. app/jobs/slow_python_job.rb中打开新文件并在perform函数中添加python3 /app/jobs/script.py

  4. 在你希望它运行的控制器方法中添加SlowPythonJob.perform_later

现在,当您在浏览器中打开该控制器操作时,它会将作业排队并在后台运行它,同时立即运行其余操作。 ActiveJob 还允许您运行 SlowPythonJob.perform_now,它将运行作业并等待它完成,然后再运行其余的操作。

所做的只是告诉rails 通过Active Job Async Job 队列适配器执行SlowPythonJob 的perform 方法。这适用于开发环境。请记住,您必须设置另一个队列适配器来处理生产中的作业队列,因为Active Job Async Job 将在发生崩溃时丢弃所有作业......其他的。

这里是队列适配器列表:http://edgeapi.rubyonrails.org/classes/ActiveJob/QueueAdapters.html

【讨论】:

  • 对于执行功能,您是否建议将'python3 /app/jobs/script.py'放在刻度线中?没有这样的东西,它们就无法工作。
  • system, `` 和 Open3 应该都可以工作。我认为 Open3 更好,因为您可以阅读 err、out 和 st 以查看它是否正常运行。使用 `` 运行它不会告诉你有错误
  • 不幸的是,这些都不起作用。当作业被调用时,它似乎接管了 Rails 服务器并且服务器停止做任何其他事情。
  • 您如何在控制器中调用SlowPythonJob?你确定你没有直接在其他地方调用脚本吗?如果您调用 perform_later,ActiveJob 将在其自己的单独进程中运行脚本
猜你喜欢
  • 2020-05-20
  • 1970-01-01
  • 2012-03-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多