代码之家  ›  专栏  ›  技术社区  ›  sscirrus

尝试运行Python脚本而不中断Rails服务器

  •  1
  • sscirrus  · 技术社区  · 7 年前

    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服务器可以响应它?

    1 回复  |  直到 7 年前
        1
  •  1
  •   robertoplancarte    7 年前

    ActiveJob应该有用。试试这个:

    1. rails g job SlowPython

    2. 将缓慢的python脚本移动到 app/jobs/script.py

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

    4. 在控制器的方法中,您希望它运行add SlowPythonJob.perform_later

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

    Active Job Async Job 队列适配器。这对于开发环境非常有效。请记住,您必须设置另一个队列适配器来处理生产中的作业队列,因为 活动作业异步作业 如果撞车的话会丢掉所有的工作。。。而且它的速度和功能都不如其他的。

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