如何从运行在ubuntu上的Apache提供的python脚本中生成一个长时间运行的python进程?

如何从运行在ubuntu上的Apache提供的python脚本中生成一个长时间运行的python进程?,python,apache,process,daemon,spawn,Python,Apache,Process,Daemon,Spawn,到目前为止,我所发现的一切都是好的,只要它没有在web环境中使用 我有一个在Apache中运行的简单python“管理工具”web应用程序,我使用vhost中的简单配置: AddHandler cgi script.py. 不需要高性能,也不需要python框架。用户选择某些条件,这些条件通过GET请求发送到服务器&然后apache调用一个python脚本并编译报告。问题是,报告的复杂性正在增长,编译此报告所需的时间可能超过20分钟,因此我希望生成一个新的完全独立的进程来异步生成报告,从而允许服

到目前为止,我所发现的一切都是好的,只要它没有在web环境中使用

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

AddHandler cgi script.py.

不需要高性能,也不需要python框架。用户选择某些条件,这些条件通过GET请求发送到服务器&然后apache调用一个python脚本并编译报告。问题是,报告的复杂性正在增长,编译此报告所需的时间可能超过20分钟,因此我希望生成一个新的完全独立的进程来异步生成报告,从而允许服务器快速返回到客户端

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

所有这些操作都完全相同——它们启动一个新进程,但主脚本在返回到客户端之前等待子进程完成。我希望主脚本直接返回到客户机,并让新生成的进程运行以编译报告

os.system("""
cd /the_directory
python -m web.wait &
""")
我想要一个最简单的解决方案-这是一个管理工具,只有我为少数用户维护

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


我过去用php做这类事情比较容易,我不敢相信在python中是不可能的。

你可以用
Popen
shell=False

例如:

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

嗨,杜桑,这和我试过的其他东西完全一样。Apache提供的主脚本等待新的长时间运行的py进程完成,然后才刷新到浏览器。感觉有一些基本的东西需要改变,然后所有常用的技术都会起作用。我只是还没有找到它是什么。或者,从ApachePython脚本,我可以对php脚本进行Ajax调用,该脚本执行启动python报告生成器的shell脚本——但他们脑子里有谁想这么做?!?
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()
Popen(["bash", "test.sh"], shell=False)