首页 > 解决方案 > 在 python 中服务 web 请求,产生一个新的长时间运行的子进程

问题描述

我目前有一个 python 命令行应用程序,它使用 pythoninvoke包来组织、列出和执行任务。有许多任务文件(由用户控制和创建,而不是我)。某些任务文件的执行时间可能超过一个小时。每个任务实际上是一个测试脚本/程序。invoke在列出/执行任务文件中的所有任务(我们称其为testsuite)或仅其中一堆(任务集合)或单个任务中很有用。(拥有大量松散的脚本并以用户想要的方式组织、列出和运行它们将是一项艰巨的任务,因此invoke)。但是,invoke不能用作库。它不提供可用于列出和运行测试任务的 API。所以我被迫跑invoke作为命令行程序的子进程中的shell命令。我将(通过execl())当前进程替换为,invoke因为一旦控制权传递给invoke,就无需返回父进程。目前还不错。。

现在,要求该命令行程序可以从 Web 应用程序中调用。所以我需要将这个 cmdline 程序包装在一个宁静的 http API 中。我决定用它bottle.py来保持简单。

我知道长时间运行的测试套件(任务)必须在 http 请求/响应周期之外完成。但我无法最终确定如何去做(可能。我可能是过度思考)。但这就是我想要的...

在上述情况下,我说得对吗..

有很多关于所有这些的材料,如果是的话,我已经阅读了很多。但它仍然让我不清楚如何准确地实现我的要求。任何方向/指针将不胜感激。我也很感激任何关于“不使用”的建议。

标签: asynchronoussubprocessbottlepyinvoke

解决方案


如果您需要一些非常简单的东西,那么您可以围绕任务假脱机程序(运行任务的 Linux 工具)编写一个包装器https://vicerveza.homeunix.net/~viric/soft/ts/(尤其是https://vicerveza.homeunix.net /~viric/soft/ts/article_linux_com.html了解更多详情)

否则,最好切换到 uwsgi spooler、rq 和 redis 或 celery 和 rabbitmq(因为 redis 在一定程度上可以工作)。


推荐阅读