Ruby on Rails在来自Python脚本的HTTP请求期间挂起

我正在用Ruby on Rails编写一个Web应用程序,用户可以在Web编辑器中编写Python代码,并在服务器上的docker环境中执行它。 我写了一个简单的python代码来创build一个docker容器:

import docker import sys if __name__ == "__main__": if(len(sys.argv) == 2): token = sys.argv[1] client = docker.from_env() res = client.containers.run('openql','python3 /home/pythonwrapper.py '+token) else: print("Requires one parameter") 

正如你可以看到它使用图像openql创build一个docker容器,并在里面执行一个简单的Python脚本。 如果用户在Web编辑器中按下执行button,Ruby on Rails将使用以下命令来执行此脚本: system("python","script.py","<TOKEN>")到目前为止, 。

但是,在pythonwrapper.py容器中执行pythonwrapper.py出现问题。 我正在使用python的请求库来请求用户写入的文件在docker容器中执行它们。 代码如下所示:

 # Request all the available assets, it does not download the content of the files. # Downloading the content of the files is done in a later request url = rails_url+"allAssets/"+token res = requests.get(url) #Convert bytes into string content = str(res.content, 'utf8') 

看起来很简单,但在这个请求期间,整个Ruby Web服务器上的ruby挂起。 奇怪的是,如果我在重新启动服务器之后首先从控制台手动执行这个脚本,那么这一切都可以正常工作。

我从Rails控制台得到的唯一的东西是:

 Started GET "/allAssets/123" for 10.0.2.15 at 2017-08-02 10:24:59 +0200 

当我退出Web服务器重新启动时,Ruby on Rails显示以下日志:

截图控制台

然后什么也没有。 有谁知道可能是什么问题?

我猜你应该在后台运行容器。

  res = client.containers.run('openql','python3 /home/pythonwrapper.py '+token, detach=True) 

这将确保您的服务器不会卡住,直到等待容器完成并完成正在执行的命令