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

Ruby on Rails hangs during HTTP request from Python script

我正在 Rails 的 Ruby 中编写 Web 应用程序,用户可以在其中在 Web 编辑器中编写 python 代码并在 docker 的环境中执行它服务器。我编写了一个简单的 python 代码来创建 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 创建了一个 docker 容器,并在其中执行一个简单的 python 脚本。如果用户在 Rails 上按下 Web 编辑器 Ruby 中的执行按钮,则使用以下命令执行此脚本:system("python","script.py","<TOKEN>") 目前一切顺利,一切正常。

但是,在 docker 容器内执行 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') 

看起来很简单,但是 rails 网络服务器上的整个 ruby 在此请求期间挂起。奇怪的是,如果我在重新启动服务器后首先从控制台手动执行此脚本,一切正常。

我从 Rails 控制台得到的唯一信息是:

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

当我退出网络服务器重新启动时,Rails 上的 Ruby 显示以下日志:

Screenshot console

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

我猜你应该是 运行 背景中的容器。

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

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