lizy169 发表于 2022-9-27 15:44

多进程+for循环内存爆了

开了几个多进程,持续定时运行for循环,
运行一段时间后,内存越来越大,直到满
手动关掉程序,内存马上就清空,
怎样才能让它再运行一个循环后自动释放内存啊?
用gc.collect()好像没用,不知道是不是我没用对
求大神指点




import multiprocessing as mp
import time


def f1(x):
    for i in x:
      print(i)
    time_sleep(x)

def time_sleep(x):
    time.sleep(2)
    f1(x)

if __name__ == '__main__':
    l1 = ['a','b','c']
    l2 = ['d','e','f']
    l3 = ['g','h','j']
    p1 = mp.Process(target=f1, args=(l1,))# 建立子进程P1
    p2 = mp.Process(target=f1, args=(l2,))# 建立子进程P2
    p3 = mp.Process(target=f1, args=(l3,))# 建立子进程P3# #
    p1.start()
    p2.start()
    p3.start()

shadmmd 发表于 2022-9-27 15:44

本帖最后由 shadmmd 于 2022-9-27 18:44 编辑

`time.sleep()`本来的功能就是暂停几秒或继续执行,不需要重写一个`time_sleep()`函数并在这个函数里面再次调用`f1()`.
你写出来的f1()函数是这样一个执行顺序:
> 第一步:执行for循环;
第二步:for循环后去`time_sleep()`;
第三步:`time_sleep()`;
第三步:`time_sleep()`内部调用`f1()`;

`f1()`自己调用自己,满足递归算法的其中一个特征,但是因为你的`f1()`没有结束条件与跳出条件,递归被写成了死循环;

内存增加的原因:每调用一次time_sleep()就增加一层循环,每加一层就要更多的内存,你这个递归还是只写半边(只深入进去不拔出来),那程序只会一直执行到内存爆满了。

解决方法:
一:time_sleep()里面去掉f1()的调用,上面网友已经说过了;
二:重新预习一次递归算法(经典的斐波那契数列递归求解),然后重写;
> 函数自己调用自己并且带有结束条件的才能算入递归,没有结束条件那就成死循环了。

漁滒 发表于 2022-9-27 15:57

你这调用堆栈深度一直在增加

wuxin9749 发表于 2022-9-27 16:03

死循环一直往下调用f1

woflant 发表于 2022-9-27 17:11

递归调用,但是没有跳出条件,一直循环执行,导致堆栈空间溢出

ErrorBug 发表于 2022-9-27 17:19

漁滒 发表于 2022-9-27 15:57
你这调用堆栈深度一直在增加

大佬可以说一下为什么么???

wodekuxiao1025 发表于 2022-9-27 17:20

不会写都看明白了,你这死循环下。。。。。
第二个函数 f1(x)去掉

yangzi125z 发表于 2022-9-27 17:47

time_sleep 和 f1 互相调用?
这不死循环了吗。。。

lizy169 发表于 2022-9-27 17:53

yangzi125z 发表于 2022-9-27 17:47
time_sleep 和 f1 互相调用?
这不死循环了吗。。。

要的就是这个死循环,目的就是要它定时2秒,执行一次f1函数

kamisora 发表于 2022-9-27 18:01

递归了,要避免这种你call我,我再call你的情况。搞个while加个变量也能满足你的需求
页: [1] 2
查看完整版本: 多进程+for循环内存爆了