python - 如何从运行在 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 中是不可能的。
解决方案
你可以Popen
使用shell=False
例子:
Popen(["bash", "test.sh"], shell=False)
推荐阅读
- php - 我如何逃避`
- python - Python - 傅里叶变换错误频率
- javascript - 从 PHP 请求中填充 Javascript 数组
- java - 如何使用 Rest-assured 从具有多个命名空间的 SOAP XML 响应中验证特定节点?
- python - 如何绘制一个带有网格的圆柱体?
- javascript - Javascript中数字的精度浮点数如何工作?
- java - 不清楚动态绑定
- php - 如何在 laravel 中为用户和管理员使用两个表?
- google-apps-script - 在 Google 表格上的一个或单独文件中创建用户界面菜单?
- javascript - 使用 Formidable 时,如何从 AJAX 请求发送表单数据?