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)
这将确保您的服务器不会卡住,直到等待容器完成并完成正在执行的命令