作者sean72 (.)
看板Python
标题Re: [问题] constructor
时间Tue Dec 16 18:24:15 2014
※ 引述《sean72 (.)》之铭言:
: 标题: [问题] constructor
: 时间: Tue Dec 16 15:49:41 2014
:
: import socket
:
: class TCP:
: def __init__(self, ip, port):
: self.abc = 'hello'
:
: s = socket.socket(xxxxxxxx)
: s.connect(ip, port) # use python lib to create tcp connection
:
:
: conn = TCP(192.168.1.1, 1234)
:
:
: 上面是一段pseudo code
: 请问如果s.connect()没有成功
: python raise err
: __init__()没有完成
: 变数conn也不会成功的allocate memory
: 但是self.abc这个变数呢? 会默默地吃掉一些记忆体吗?
: 应该不会才对吧? 因为self, 也就是conn没有成功的init
:
:
:
:
: --
:
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 76.169.54.91
: ※ 文章网址: http://webptt.com/cn.aspx?n=bbs/Python/M.1418716183.A.466.html
: → uranusjr: 其实事情比你想的要复杂很多, 但要解释清楚很麻烦 12/16 16:32
: → uranusjr: 在这个例子里 Python 会帮你把它搞定, 不用想太多 12/16 16:32
我手边有一个案子
python system是一个在Linux上面执行的app
python 跑了一周左右会莫名的挂掉
Linux活着 因此推测是python 吃了太多系统资源而被OS关掉
其中一个徵兆是free memory不断的减少
因此推测python app有memory leak
从app内部err log可知
python app在闲置状态什麽事情都没有做
唯一执行的是: 尝试重新tcp连线
但是因为并没有接上一个实体的ethernet device 所以连线一定 time out
所以python app一直re-connect -> socket close -> re-connect -> socket close
memory leak我能想到的原因有
1. 一个无限制增加的 global list / dict
2. cyclic referencing
3. recursive无穷回圈
但是程式里面都没有上面三个写法
因此怀疑
if there was any memory not free-ed by pyhton when __init__ failed
谢谢!
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 76.169.54.91
※ 文章网址: http://webptt.com/cn.aspx?n=bbs/Python/M.1418725458.A.C5F.html
※ 编辑: sean72 (76.169.54.91), 12/16/2014 18:25:39
1F:→ alibuda174: 从你的程式看不出来有memory leak 12/16 19:32
2F:推 LiloHuang: 直接用 Valgrind 来看看是不是有 leak 最快 12/16 20:07
3F:→ LiloHuang: 如果有再进一步来抓看看是否有哪个 PyObject 没被放掉 12/16 20:09
4F:→ ccwang002: 可以用 Guppy 的 heapy 看 heap 上 PyObject 的变化 12/17 00:14
5F:→ uranusjr: 你推论跳太快了, 至少先 ps 一下证明是 Python 在吃啊 12/17 11:02