尝试在不中断Rails服务器的情况下运行Python脚本

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (1)
  • 关注 (0)
  • 查看 (74)

我试图从Rails应用程序运行Python脚本。此脚本可以通过调用以下命令将进度更新POST到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服务器可以响应它?

提问于
用户回答回答于

ActiveJob应该工作。尝试这个:

  1. 在控制台中生成一个新的Job rails g job SlowPython
  2. 将你的慢速python脚本移动到 app/jobs/script.py
  3. 打开新文件app/jobs/slow_python_job.rb并添加python3 /app/jobs/script.pyperform功能
  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

扫码关注云+社区

领取腾讯云代金券