1

设想

我在 php 中使用exec(...)调用 python 脚本,python 发挥了它的作用,它是非结构化环境,没有 django 或任何其他框架。

产品是基于客户端的产品,大多数任务都是长期运行的任务。

因此,如果客户有任何要求,必须立即满足。对我们来说,时间也是我们不能拖延进程的主要关注点。

因此,如果我会收到来自客户端的太多请求(可能是,crons 也在同时工作),我将获得太多的 python 进程,并且据我所知,每个 exec(...) 都会调用解释器。因此,如果无论如何我可以防止在每次通话时调用解释器,那对我来说会很好。1Kb 或 1Mb 的内存空间非常有用。

问题

  1. 内存使用率很高(如果我可以节省 1Mb,我想尝试任何解决方案。假设脚本写得很好。在循环中给出了适当的睡眠并且垃圾收集器管理得很好。)
  2. 有时对于长时间运行的 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模块最多可以创建多少个解释器(像上面的代码一样)?

4

1 回答 1

0

我不确定我是否完全理解你的问题。通常,在任何情况下,代码都是按顺序执行的,除非明确告知不要这样做。如果你把这些行放在你的 shell 中,你的 shell 首先启动一个 python 实例program1.pyprogram2.py在完成之前,您无法继续执行program1.py。因此,您在任何时间点都只有一个 python 解释器。

如果要将每个脚本作为后台进程运行,则需要将 & 放在每一行的末尾 this python program1.py &。通过这种方式,您可以同时运行多个脚本。如果您的脚本需要很长时间才能完成,您将有 6 个解释器同时运行。我很确定每个脚本都需要指定一个解释器。

于 2016-12-09T05:41:03.337 回答