多进程+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 18:44 编辑
`time.sleep()`本来的功能就是暂停几秒或继续执行,不需要重写一个`time_sleep()`函数并在这个函数里面再次调用`f1()`.
你写出来的f1()函数是这样一个执行顺序:
> 第一步:执行for循环;
第二步:for循环后去`time_sleep()`;
第三步:`time_sleep()`;
第三步:`time_sleep()`内部调用`f1()`;
`f1()`自己调用自己,满足递归算法的其中一个特征,但是因为你的`f1()`没有结束条件与跳出条件,递归被写成了死循环;
内存增加的原因:每调用一次time_sleep()就增加一层循环,每加一层就要更多的内存,你这个递归还是只写半边(只深入进去不拔出来),那程序只会一直执行到内存爆满了。
解决方法:
一:time_sleep()里面去掉f1()的调用,上面网友已经说过了;
二:重新预习一次递归算法(经典的斐波那契数列递归求解),然后重写;
> 函数自己调用自己并且带有结束条件的才能算入递归,没有结束条件那就成死循环了。 你这调用堆栈深度一直在增加 死循环一直往下调用f1 递归调用,但是没有跳出条件,一直循环执行,导致堆栈空间溢出 漁滒 发表于 2022-9-27 15:57
你这调用堆栈深度一直在增加
大佬可以说一下为什么么??? 不会写都看明白了,你这死循环下。。。。。
第二个函数 f1(x)去掉 time_sleep 和 f1 互相调用?
这不死循环了吗。。。 yangzi125z 发表于 2022-9-27 17:47
time_sleep 和 f1 互相调用?
这不死循环了吗。。。
要的就是这个死循环,目的就是要它定时2秒,执行一次f1函数 递归了,要避免这种你call我,我再call你的情况。搞个while加个变量也能满足你的需求
页:
[1]
2