吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1695|回复: 17
收起左侧

[求助] 多进程+for循环内存爆了

[复制链接]
lizy169 发表于 2022-9-27 15:44
25吾爱币
开了几个多进程,持续定时运行for循环,
运行一段时间后,内存越来越大,直到满
手动关掉程序,内存马上就清空,
怎样才能让它再运行一个循环后自动释放内存啊?
用gc.collect()好像没用,不知道是不是我没用对
求大神指点




[Python] 纯文本查看 复制代码
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()

最佳答案

查看完整内容

[md]`time.sleep()`本来的功能就是暂停几秒或继续执行,不需要重写一个`time_sleep()`函数并在这个函数里面再次调用`f1()`. 你写出来的f1()函数是这样一个执行顺序: > 第一步:执行for循环; 第二步:for循环后去`time_sleep()`; 第三步:`time_sleep()`; 第三步:`time_sleep()`内部调用`f1()`; `f1()` 自己调用自己,满足递归算法的其中一个特征,但是因为你的`f1()` 没有结束条件与跳出条件,递归被写成了死循环; ...

免费评分

参与人数 2热心值 +2 收起 理由
RickSanchez + 1 我很赞同!
dgy + 1 谢谢@Thanks!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

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()的调用,上面网友已经说过了;
二:重新预习一次递归算法(经典的斐波那契数列递归求解),然后重写;

函数自己调用自己并且带有结束条件的才能算入递归,没有结束条件那就成死循环了。

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
pwp + 1 + 1 大佬的比喻生动形象

查看全部评分

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

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
lizy169 + 1 + 1 谢谢@Thanks!

查看全部评分

wuxin9749 发表于 2022-9-27 16:03
woflant 发表于 2022-9-27 17:11
递归调用,但是没有跳出条件,一直循环执行,导致堆栈空间溢出

免费评分

参与人数 1热心值 +1 收起 理由
lizy169 + 1 谢谢@Thanks!

查看全部评分

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加个变量也能满足你的需求
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 警告:本版块禁止回复与主题无关非技术内容,违者重罚!

快速回复 收藏帖子 返回列表 搜索

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-4-26 00:57

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表