从 Bottle Web 服务器执行长 运行 作业
Execute Long running jobs from bottle web server
我想做什么
我有一个正在生成输出的前端系统。我正在使用瓶子通过 post 请求访问此数据 (JSON)。我的 post 收到 json 没有问题。我需要执行后端 python 程序(搅拌机自动化)并将此 JSON 数据传递给该程序。
我尝试过的事情
Subprocess
- 使用 subprocess 调用程序并传递输入。表面上似乎可以执行,但是当我检查系统监视器时,程序没有启动,但我的服务器继续正常运行 运行。这个子进程命令 运行 在独立于服务器执行时完全没问题。
blender、script 和 json 都是具有 绝对文件路径
的字符串对象
sub = subprocess.Popen([blender + " -b -P " + script + " -- " + json], stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=False)
C 风格 os.fork()
- 与上面相同,我发现阅读 pydoc 子进程使用这些方法运行
Double Fork
- 从这里的 posting 尝试从服务器分叉,然后从该分叉调用子进程并终止子进程的父进程以创建一个孤儿。我的子进程命令仍然没有执行,也没有出现在系统监视器中。
我需要的
我需要一个解决方案,该解决方案将 运行 来自 Bottle 服务器的自身进程。它将处理多个请求,因此子进程不会在服务器中阻塞。被调用的过程是完全自动化的,只需要在执行命令中发送 JSON 数据。子进程程序的结果将是在服务器上创建的文件的字符串路径。
从我的测试驱动程序调用时,上述子进程工作得很好。我只需要将执行连接到 web 服务,这样我的前端就可以触发它的执行。
我的瓶子 post 方法 - 调用时打印 json 没有问题。
@post('/getData')
def getData():
json_text = request.json
print(json_text)
我不知道从这里到哪里去。从我到目前为止所读的内容来看,子流程应该可以工作。任何帮助或建议将不胜感激。如果需要其他信息,请告诉我。我将编辑更多细节。谢谢。
相关信息:
OS:Ubuntu 16.04 LTS,
Python 3.x
*编辑
这不是一个优雅的解决方案,但我的子进程调用现在可以工作了。
cmd = blender
cmd += " -b -P "
cmd += script
cmd += " -- "
cmd += str(json)
sub = subprocess.Popen([cmd], shell=True)
似乎通过设置 shell=True 并删除标准输出,stderr=PIPE 允许我看到我抛出未处理异常的输出,因为我的 json 数据是列表而不是字符串。
当使用 python 执行脚本时,由 Popen.subprocess 创建的进程将无意中继承并保持打开文件描述符。
您需要关闭它,以便该进程可以 运行 独立。 (close_fds=真)
subprocess.Popen(['python', "-u", Constant.WEBAPPS_FOLDER + 'convert_file.py', src, username], shell=False, bufsize=-1, close_fds=True)
此外,您不必使用 shell 来创建另一个进程。它可能是无意的 consequences。
我遇到了完全相同的问题,瓶子不是 returning/hangs。现在可以使用了。
我想做什么
我有一个正在生成输出的前端系统。我正在使用瓶子通过 post 请求访问此数据 (JSON)。我的 post 收到 json 没有问题。我需要执行后端 python 程序(搅拌机自动化)并将此 JSON 数据传递给该程序。
我尝试过的事情
Subprocess
- 使用 subprocess 调用程序并传递输入。表面上似乎可以执行,但是当我检查系统监视器时,程序没有启动,但我的服务器继续正常运行 运行。这个子进程命令 运行 在独立于服务器执行时完全没问题。blender、script 和 json 都是具有 绝对文件路径
的字符串对象sub = subprocess.Popen([blender + " -b -P " + script + " -- " + json], stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=False)
C 风格 os.fork()
- 与上面相同,我发现阅读 pydoc 子进程使用这些方法运行Double Fork
- 从这里的 posting 尝试从服务器分叉,然后从该分叉调用子进程并终止子进程的父进程以创建一个孤儿。我的子进程命令仍然没有执行,也没有出现在系统监视器中。我需要的
我需要一个解决方案,该解决方案将 运行 来自 Bottle 服务器的自身进程。它将处理多个请求,因此子进程不会在服务器中阻塞。被调用的过程是完全自动化的,只需要在执行命令中发送 JSON 数据。子进程程序的结果将是在服务器上创建的文件的字符串路径。
从我的测试驱动程序调用时,上述子进程工作得很好。我只需要将执行连接到 web 服务,这样我的前端就可以触发它的执行。
我的瓶子 post 方法 - 调用时打印 json 没有问题。
@post('/getData')
def getData():
json_text = request.json
print(json_text)
我不知道从这里到哪里去。从我到目前为止所读的内容来看,子流程应该可以工作。任何帮助或建议将不胜感激。如果需要其他信息,请告诉我。我将编辑更多细节。谢谢。
相关信息: OS:Ubuntu 16.04 LTS, Python 3.x
*编辑
这不是一个优雅的解决方案,但我的子进程调用现在可以工作了。
cmd = blender
cmd += " -b -P "
cmd += script
cmd += " -- "
cmd += str(json)
sub = subprocess.Popen([cmd], shell=True)
似乎通过设置 shell=True 并删除标准输出,stderr=PIPE 允许我看到我抛出未处理异常的输出,因为我的 json 数据是列表而不是字符串。
当使用 python 执行脚本时,由 Popen.subprocess 创建的进程将无意中继承并保持打开文件描述符。
您需要关闭它,以便该进程可以 运行 独立。 (close_fds=真)
subprocess.Popen(['python', "-u", Constant.WEBAPPS_FOLDER + 'convert_file.py', src, username], shell=False, bufsize=-1, close_fds=True)
此外,您不必使用 shell 来创建另一个进程。它可能是无意的 consequences。
我遇到了完全相同的问题,瓶子不是 returning/hangs。现在可以使用了。