设想
我在 php 中使用exec(...)调用 python 脚本,python 发挥了它的作用,它是非结构化环境,没有 django 或任何其他框架。
产品是基于客户端的产品,大多数任务都是长期运行的任务。
因此,如果客户有任何要求,必须立即满足。对我们来说,时间也是我们不能拖延进程的主要关注点。
因此,如果我会收到来自客户端的太多请求(可能是,crons 也在同时工作),我将获得太多的 python 进程,并且据我所知,每个 exec(...) 都会调用解释器。因此,如果无论如何我可以防止在每次通话时调用解释器,那对我来说会很好。1Kb 或 1Mb 的内存空间非常有用。
问题
- 内存使用率很高(如果我可以节省 1Mb,我想尝试任何解决方案。假设脚本写得很好。在循环中给出了适当的睡眠并且垃圾收集器管理得很好。)
- 有时对于长时间运行的 python 脚本,如果从 php 调用该脚本,则使用 exec(...) 并且未在后台调用进程,并且该 python 脚本已经结束,并且在该 exec 之后执行下一行仍然需要时间.
解决方案
对于解决方案,我认为我应该对 python 使用 API 调用。但请记住我不能使用任何框架。要使用框架,我需要重写代码,这在我的情况下是不可能的。所以 CGI 和 FCGI 可以在这里帮助我。
要从 API 调用运行 python 脚本,我需要启用 CGI 才能运行。
但我发现很有趣::
使用 CGI 与 Web 服务器通信的程序需要由服务器针对每个请求启动。因此,每个请求都会启动一个新的 Python 解释器——这需要一些时间来启动——从而使整个接口仅可用于低负载情况。
如果我将运行如下脚本,那么所有脚本都会立即启动
subprocess.Popen(["python", "program1.py"])
subprocess.Popen(["python", "program2.py"])
subprocess.Popen(["python", "program3.py"])
subprocess.Popen(["python", "program4.py"])
subprocess.Popen(["python", "program5.py"])
subprocess.Popen(["python", "program6.py"])
假设这所有程序都是长时间运行的任务。
1)我可以阻止python模块创建更多解释器吗?如果可以,我该怎么做?
2)一个python模块最多可以创建多少个解释器(像上面的代码一样)?