首页 > 解决方案 > 如何从运行在 ubuntu 上的 Apache 提供的 python 脚本生成一个长时间运行的 python 进程?

问题描述

到目前为止,我发现的所有东西只有在没有在 Web 环境中使用的情况下才是好的。

我有一个在 Apache 中运行的简单 python“管理工具”Web 应用程序,并且我在 vhost 中使用了简单的配置:

AddHandler cgi-script .py.

不需要高性能,没有 python 框架。用户选择某些标准,这些标准通过 GET 请求发送到服务器和 python 脚本,然后由 apache 调用并编译报告。问题是报告的复杂性正在增长,编译此报告所需的时间可能超过 20 分钟,所以我想产生一个新的完全独立的进程来异步生成报告,让服务器快速返回到客户端.

我的问题是我已经尝试了所有我能找到的能够做到这一点的方法,但一切都以同样的方式失败;当我生成一个新进程时,父脚本在新进程完成之前不会返回给客户端。

所有这些都完全相同——它们启动一个新进程,但主脚本等待子进程完成,然后再返回客户端。我希望主脚本直接返回给客户端,并让新生成的进程继续运行以编译报告。

os.system("""
cd /the_directory
python -m web.wait &
""")
command = ['python', '/the_directory/wait.py &']
Popen(command, shell=True, start_new_session=True)
L = ['python', '/the_directory/wait.py']
os.spawnvp(os.P_NOWAIT, 'python', L)
L = ['test.sh']
os.spawnvpe(os.P_NOWAIT, '/the_directory/test.sh', L, os.environ)


where test.sh contains: 

#!/bin/sh
/the_directory/wait.py &
jobs = []
for i in range(5):
    p = multiprocessing.Process(target=wait.dostuff, )
    jobs.append(p)
    p.start()

我想要最简单的解决方案——它是一个仅由我为极少数用户维护的管理工具。

如果真的没有办法做到这一点,那么我想我将不得不使用每分钟运行一次的 cron 并使用一个简单的队列,也许使用 redis 或其他东西,但这并不理想。

我以前在 php 中比较容易做这种事情,我不敢相信这在 python 中是不可能的。

标签: pythonapacheprocessdaemonspawn

解决方案


你可以Popen使用shell=False

例子:

Popen(["bash", "test.sh"], shell=False)

推荐阅读