我试图从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')
在每种情况下,一旦启动脚本,服务器基本上就会挂起,好像它正在等待。我正在使用的测试脚本只发送一个进度更新然后退出,所以即使服务器正在等待它完成它也不会导致重大延迟。
这里发生了什么,以及如何在后台正确运行脚本以便我的Rails服务器可以响应它?
发布于 2018-09-10 11:34:01
ActiveJob应该工作。尝试这个:
rails g job SlowPython
app/jobs/script.py
app/jobs/slow_python_job.rb
并添加python3 /app/jobs/script.py
该perform
功能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
https://stackoverflow.com/questions/-100008851
复制相似问题