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



到目前为止,我发现的一切都是好的,只有在没有在web环境中使用的情况下。

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

AddHandler cgi-script .py.

不需要高性能,也不需要python框架。用户选择经由GET请求发送到服务器&然后apache调用一个python脚本并编译报告。问题是,报告的复杂性正在增长,编译此报告所需的时间长度可能>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中这是不可能的。

您可以将Popenshell=False一起使用

示例:

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

最新更新