V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn 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 · 1887 次点击
    这是一个创建于 1605 天前的主题,其中的信息可能已经有所发展或是发生改变。
    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   ·   实用小工具   ·   1114 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 20ms · UTC 18:28 · PVG 02:28 · LAX 10:28 · JFK 13:28
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.