【发布时间】: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