当使用 Python 多线程创建多个类对象,并传到线程函数里面去,会因为每增加一个线程而创建一个类对象而导致内存增加吗 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Lear Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
qybing
V2EX    Python

当使用 Python 多线程创建多个类对象,并传到线程函数里面去,会因为每增加一个线程而创建一个类对象而导致内存增加吗

  •  
  •   qybing 2020-07-27 16:20:36 +08:00 2278 次点击
    这是一个创建于 1909 天前的主题,其中的信息可能已经有所发展或是发生改变。
    15 条回复    2020-07-28 16:11:28 +08:00
    imn1
        1
    imn1  
       2020-07-27 16:38:01 +08:00
    关注一下
    有文章写线程结束未必销毁对象,我不熟,听楼下意见

    我现在喜欢函数+dataclass,或者在一个类方法里面做线程处理,每线程只生成记录数据的对象
    这样不会创建很多对象
    O0oOo0
        2
    O0oOo0  
       2020-07-27 17:23:31 +08:00
    nthhdy
        3
    nthhdy  
       2020-07-27 18:17:56 +08:00
    是在线程函数里定义 class,还是预先定义好多个 class 传入线程函数?

    照我的浅见,线程函数不定义新 class,不会有类对象被新建,不会占更多内存。
    如果在线程函数里面定义 class,每一个新进程都会创建自己的类对象,起多少线程就占多少份内存。
    nthhdy
        4
    nthhdy  
       2020-07-27 18:22:09 +08:00
    @O0oOo0 长知识了

    但是这篇文章里讲的,前提是 fork 子进程且使用到共享内存。跟楼主讲的不一样,楼主都没新建进程,只新建线程了,无所谓写时复制。
    qybing
        5
    qybing  
    OP
       2020-07-27 18:27:11 +08:00
    @nthhdy 线程外面定义 class,每起一个线程就会定义一个 class,然后往线程函数里面传
    nthhdy
        6
    nthhdy  
       2020-07-27 18:40:39 +08:00
    照我浅见,如果 python2 的话,我理解类似这样?

    ```python

    import thread

    def thread_func(cls):
    a = cls()
    # do something with a ....

    def work():

    class DefineClass:
    pass
    print id(DefineClass)

    thread.start_new_thread(thread_func, (DefineClass, ))


    for i in range(100):
    work()

    ```

    那么每次调用 work,都会新建一个类对象
    nthhdy
        7
    nthhdy  
       2020-07-27 18:45:27 +08:00
    https://gist.github.com/workingenius/1a4df7f9ae8f366447f2c6138630c99b

    代码不好看,抱歉。看看这个行不行
    fasionchan
        8
    fasionchan  
       2020-07-27 19:02:14 +08:00
    内存是否增加取决于对象创建以及销毁,跟多线程无关。如果你一直创建对象,但不回收,内存肯定是要增加的。
    O0oOo0
        9
    O0oOo0  
       2020-07-28 10:49:28 +08:00
    @nthhdy 感谢指正
    qybing
        10
    qybing  
    OP
       2020-07-28 12:32:21 +08:00
    @fasionchan 线程函数是死循环,对象不销毁
    qybing
        11
    qybing  
    OP
       2020-07-28 12:35:29 +08:00
    @nthhdy 你这个类是在函数里面定义的,外面可以调用吗,不太懂 python2
    qybing
        12
    qybing  
    OP
       2020-07-28 12:36:18 +08:00
    有什么方案可以解决内存增加的问题吗
    fasionchan
        13
    fasionchan  
       2020-07-28 13:25:01 +08:00
    @qybing 意思是线程不退出吗?
    qybing
        14
    qybing  
    OP
       2020-07-28 14:04:38 +08:00
    @qybing 对,不会退出,也正在想怎么手动关闭其中一个线程
    nthhdy
        15
    nthhdy  
       2020-07-28 16:11:28 +08:00
    @qybing 设置个变量让线程里的循环 break 了不就行
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2463 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 27ms UTC 04:59 PVG 12:59 LAX 21:59 JFK 00:59
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86