【问题标题】:Execute Long running jobs from bottle web server从 Bottle Web 服务器执行长时间运行的作业
【发布时间】:2017-04-27 22:34:55
【问题描述】:

我想做什么

我有一个生成输出的前端系统。我正在使用瓶子通过发布请求访问此数据(JSON)。我的帖子毫无问题地收到了 json。我需要执行一个后端 python 程序(blender 自动化)并将这个 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 子进程使用这些方法进行操作

双分叉

- 从这里的帖子尝试从服务器分叉,然后从该分叉调用子进程并终止子进程的父进程以创建一个孤儿。我的子进程命令仍然没有执行并且永远不会出现在系统监视器中。

我需要什么

我需要一个解决方案,该解决方案将在自己的进程中从瓶服务器运行。它将处理多个请求,因此子进程不会在服务器中阻塞。被调用的过程是完全自动化的,只需要在执行命令中发送 JSON 数据。子进程程序的结果将是在服务器上创建的文件的字符串路径。

当从我的测试驱动程序调用时,上述子进程工作得非常好。我只需要将执行连接到 web 服务,这样我的前端就可以触发它的执行。

我的瓶子发布方法 - 调用时打印 json 没有问题。

@post('/getData')
def getData():
    json_text = request.json
    print(json_text)

我不知道从这里去哪里。从我到目前为止所读的内容来看,子流程应该可以工作。任何帮助或建议将不胜感激。如果需要更多信息,请告诉我。我将编辑更多细节。谢谢。

相关信息: 操作系统: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 数据是一个列表而不是字符串。

【问题讨论】:

  • 我很好奇:是什么让您认为您需要一个单独的流程?
  • @ron.rothman tbh 我认为这是处理这个问题的正确方法。
  • 我尝试不带子进程直接运行,还是不行。

标签: python-3.x subprocess bottle


【解决方案1】:

当使用 python 执行脚本时,由 Popen.subprocess 创建的进程将无意继承并保持打开文件描述符。

您需要关闭它,以便该进程可以独立运行。 (close_fds=True)

subprocess.Popen(['python', "-u", Constant.WEBAPPS_FOLDER + 'convert_file.py', src, username], shell=False, bufsize=-1, close_fds=True)

另外,你不必使用 shell 来创建另一个进程。它可能是无意的consequences

我遇到了完全相同的问题,即瓶子没有返回/挂起。现在可以了。

【讨论】:

  • 有趣。我将修改代码,看看会发生什么。这听起来比我找到的解决方案优雅得多。谢谢
猜你喜欢
  • 2014-03-27
  • 1970-01-01
  • 2012-03-29
  • 2019-08-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-27
相关资源
最近更新 更多