当前位置: 首页 > 面试题库 >

多处理启动了太多的Python VM实例

毕泽宇
2023-03-14
问题内容

我正在编写一些多处理代码(Python
2.6.4,WinXP),这些代码会生成运行后台任务的进程。在处理一些琐碎的示例时,我遇到了一个问题,即即使我只告诉它产生一个固定的数字,我的代码也不断产生新的进程。

该程序本身运行良好,但是如果我在Windows TaskManager中查看,则会不断看到新的“
python.exe”进程出现。它们只是在程序运行时不断产生(最终使我的机器饿死)。

例如,
我希望下面的代码启动2个python.exe进程。第一个是程序本身,第二个是它产生的子进程。知道我在做什么错吗?

import time
import multiprocessing


class Agent(multiprocessing.Process):
    def __init__(self, i):
        multiprocessing.Process.__init__(self)
        self.i = i

    def run(self):
        while True:
            print 'hello from %i' % self.i
            time.sleep(1)


agent = Agent(1)
agent.start()

问题答案:

您似乎没有认真遵循文档中的准则,尤其是本节中有关“安全导入主模块”的部分。

if __name__ == '__main__':我相信,您需要使用一个块来保护启动代码,否则您将得到所得到的。

我认为,归结为多处理模块无法像在Linux上那样使用os.fork(),在Linux上,已经在运行的进程基本上是克隆在内存中的。在Windows(没有此类fork())上,它必须运行一个新的Python解释器,并告诉它导入您的主模块,然后在完成后执行start
/ run方法。如果您具有“模块级别”的代码,不受名称检查的保护,那么在导入期间,它将重新开始整个序列,这是无限的。



 类似资料:
  • 我在spring boot中创建了一些服务,我有11个fat jars,我将它们部署在docker容器中,我怀疑每个jar在没有任何使用的情况下消耗了1到1.5 GB的RAM,我通过运行以下命令来检查RAM: 起初我以为是java容器,我试图改成一个使用alpine的容器,但没有任何变化,所以我认为唯一的问题是我的罐子。有没有办法更改罐子正在使用的 RAM?或者这种行为是正常的,因为每个罐子都有一

  • 我的申请中有一个性能问题。 我有三个实体,其关系如下: 从数据库加载实体需要太多时间,orderLines加载的是急切加载,而Cards加载的是惰性加载。为了让应用流畅,懒惰加载是必要的。 我需要为一个案例配置即时加载,我需要帮助。 我正在使用jhsipster stack:spring boot和JPA 我试图编写Hql查询 我有un错误:意外的令牌订单(第2行) 我尝试了原生查询 但当我这么做

  • 我对JS有问题。我正在尝试制作三个按类型排序的配料列表(用于酿造药剂),所有这些都是标签中的复选框。 你应该选择(选中)三个列表中的每一个元素,以便酿造药水。如果你选择了正确的成分,然后按下“酿造药水”按钮,你就有了一种确定的药水,如果你选择三种不匹配的成分,它会显示 在页面底部写着“看来这次没用了!”按下“酿造药水”按钮后。 在JavaScript中,我对三个列表都使用了一个数组,对每个列表中的

  • 我正在开发一个spring批处理应用程序(内存为2GB),尝试处理数据(在处理过程中使用select查询获取数据),并在postgres DB中插入大约100万条处理过的记录。我在这个项目中使用Spring Data JPA。但是Spring JPA在处理这些记录时消耗了太多内存

  • 我是新的Liferay开发,我面临的麻烦与启动我的Liferay Tomcat服务器。它几乎需要3分钟(169048毫秒),这对于开发来说是不可接受的。我想把它压缩到一分钟左右。 以下是我的机器的规格: 英特尔酷睿双核T2300@1.66 GHz 4GB RAM(使用中3.24GB) 带有Service Pack 1Windows 7 Enterprise 32位 我正在使用: Liferay 6

  • 我有3个单独运行的Spring Boot-Camel应用程序。我需要链接这些进程,例如在进程A完成后,它应该启动进程B,然后一旦进程B完成,它应该继续进程C。如果中间有任何进程失败,进程链应该重试失败的进程,并继续执行到下一个。此外,在进程A中,如果路由中的任何步骤有任何失败,那么我也需要重试并从中间步骤开始。有人能帮我实现这个场景吗?