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

2020-07-27 16:20:36 +08:00
 qybing
1896 次点击
所在节点    Python
15 条回复
imn1
2020-07-27 16:38:01 +08:00
关注一下
有文章写线程结束未必销毁对象,我不熟,听楼下意见

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

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

但是这篇文章里讲的,前提是 fork 子进程且使用到共享内存。跟楼主讲的不一样,楼主都没新建进程,只新建线程了,无所谓写时复制。
qybing
2020-07-27 18:27:11 +08:00
@nthhdy 线程外面定义 class,每起一个线程就会定义一个 class,然后往线程函数里面传
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
2020-07-27 18:45:27 +08:00
https://gist.github.com/workingenius/1a4df7f9ae8f366447f2c6138630c99b

代码不好看,抱歉。看看这个行不行
fasionchan
2020-07-27 19:02:14 +08:00
内存是否增加取决于对象创建以及销毁,跟多线程无关。如果你一直创建对象,但不回收,内存肯定是要增加的。
O0oOo0
2020-07-28 10:49:28 +08:00
@nthhdy 感谢指正
qybing
2020-07-28 12:32:21 +08:00
@fasionchan 线程函数是死循环,对象不销毁
qybing
2020-07-28 12:35:29 +08:00
@nthhdy 你这个类是在函数里面定义的,外面可以调用吗,不太懂 python2
qybing
2020-07-28 12:36:18 +08:00
有什么方案可以解决内存增加的问题吗
fasionchan
2020-07-28 13:25:01 +08:00
@qybing 意思是线程不退出吗?
qybing
2020-07-28 14:04:38 +08:00
@qybing 对,不会退出,也正在想怎么手动关闭其中一个线程
nthhdy
2020-07-28 16:11:28 +08:00
@qybing 设置个变量让线程里的循环 break 了不就行

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/693486

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX