当前位置: 首页 > 知识库问答 >
问题:

Python多处理内存增加

艾泉
2023-03-14
from myfuncs import do, process

class Worker(multiprocessing.Process):

    def __init__(self, lock):
        multiprocesing.Process.__init__(self)
        self.lock = lock
        self.queue = Redis(..) # this is a redis based queue
        self.res_queue = Redis(...)

     def run():
         while True:
             job = self.queue.get(block=True)
             job.results = process(job)
             with self.lock:
                 post_process(self.res_queue, job)


def main():
    lock = multiprocessing.Semaphore(1)
    ps = [Worker(lock) for _ in xrange(4)]
    [p.start() for p in ps]
    [p.join() for p in ps]

程序每天使用的内存在增加。有人能搞清楚是怎么回事吗?

当作业超出运行方法的范围时,内存应该是空闲的,对吗?

共有1个答案

申屠俊发
2023-03-14

当作业超出运行方法的范围时,内存应该是空闲的,对吗?

首先,作用域是整个run方法,它永远循环,所以不会发生这种情况。(此外,当退出run方法时,进程将关闭,其内存将被释放……)

但即使它超出了范围,这也不意味着你似乎认为它意味着什么。Python不像C++,在C++中有存储在堆栈中的变量。所有对象都存在于堆中,并且它们一直处于活动状态,直到不再有对它们的引用为止。变量超出作用域意味着该变量不再引用它以前引用的任何对象。如果该变量是对象的唯一引用,那么它将被释放*但是如果在其他地方有其他引用,那么在其他引用消失之前,对象不能被释放。

 类似资料:
  • 问题内容: 我写了一个程序,可以总结如下: 实际代码(尤其是)要复杂得多。仅使用将其当作参数的这些值(意味着它不引用) 基本上,它将巨大的数据集加载到内存中并进行处理。输出的写操作委托给一个子进程(它实际上写到多个文件中,这需要很多时间)。因此,每次处理一个数据项时,它都会通过res_queue发送到子流程,然后该子流程根据需要将结果写入文件中。 子流程不需要访问,读取或修改以任何方式加载的数据。

  • 我已经读了一些关于我的问题的帖子(比如这篇文章),但没有一篇能解决这个问题。在我的Flask应用程序中,我使用内置在多处理中的Python(在16个物理核心上)并行下载了32-64个图像,如下所示: 下载工作正常,除了内存使用外,速度显著提高。在下载过程中,Python分配了大约100GB的RAM,尽管实际只使用了大约2GB。每个进程分配超过6 gb的RAM,仅用于下载最多4个图像,每个图像的容量

  • 问题内容: 我有三个大名单。前一个包含位数组(模块位数组0.8.0),另外两个包含整数数组。 这些数据结构占用相当多的RAM(总计约16GB)。 如果我使用以下方法启动12个子流程: 这是否意味着将为每个子流程复制l1,l2和l3,或者子流程将共享这些列表?或者更直接地说,我将使用16GB还是192GB的RAM? someFunction将从这些列表中读取一些值,然后根据读取的值执行一些计算。结果

  • 问题内容: 为什么这项工作 但是扩充会导致语法错误。 我期待有另一种方式: 问题答案: 您不能在多个目标上使用增强分配语句。 引用扩充作业文档: 除了在单个语句中分配给元组和多个目标外, 由扩展赋值语句完成的赋值与普通赋值的处理方式相同。类似地,除了可能 的就地 行为外,通过扩充分配执行的二进制操作与正常的二进制操作相同。 强调我的。 就地扩展分配从转换为(每个操作员都有相应的钩子),并且不支持将

  • 问题内容: 我一直在阅读有关Python的多处理模块的信息。我仍然认为我对它可以做什么没有很好的了解。 假设我有一个四核处理器,并且我有一个包含1000000个整数的列表,我想要所有整数的总和。我可以简单地做: 但这仅将其发送到一个内核。 是否有可能使用多处理模块将数组划分为多个,并让每个核获得其部分的总和并返回值,以便可以计算总和? 就像是: 任何帮助,将不胜感激。 问题答案: 是的,可以对多个